Đề bài
Cho một mảng số nguyên nums trong đó mỗi phần tử xuất hiện đúng ba lần, ngoại trừ một phần tử xuất hiện đúng một lần. Hãy tìm phần tử xuất hiện một lần đó và trả về nó.
Yêu cầu: Bạn phải triển khai một giải pháp có độ phức tạp thời gian tuyến tính và chỉ sử dụng không gian phụ cố định.
Ví dụ 1:
Đầu vào: nums = [2,2,3,2]
Đầu ra: 3
Ví dụ 2:
Đầu vào: nums = [0,1,0,1,0,1,99]
Đầu ra: 99
Ràng buộc:
1 <= nums.length <= 30,000
-2^31 <= nums[i] <= 2^31 - 1
Mỗi phần tử trong nums xuất hiện chính xác ba lần ngoại trừ một phần tử xuất hiện một lần.
Cách làm
#include <iostream>
using namespace std;
int timSoXuatHienMotLan(int nums[], int n) {
int motLan = 0, haiLan = 0;
for (int i = 0; i < n; i++) {
// cap nhat gia tri motLan va haiLan
motLan = (motLan ^ nums[i]) & ~haiLan;
haiLan = (haiLan ^ nums[i]) & ~motLan;
}
return motLan;
}
int main() {
int nums[] = {0, 1, 0, 1, 0, 1, 99};
int n = sizeof(nums) / sizeof(nums[0]);
cout << "Phan tu xuat hien mot lan la: " << timSoXuatHienMotLan(nums, n) << endl;
return 0;
}