Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
We can solve this in bit level. Each integer is also a bit array of size 32. We can count the number of 1 occurred in each bit. If its 4 or 1, then the bit of the single number is also 1. Otherwise it is 0.
C++ Code:
/* * func: single_number * goal: find the single number in an array that occurs once * @param A: input array A * @param n: size of the array * return: the single number */ int singleNumber(int A[], int n) { vector<int> tmp; for(int i = 0; i < 32; ++i){ int bit_count = 0; int curr_bit = 1 << i; for(int j = 0; j < n; j++){ if(A[j] & curr_bit) ++bit_count; } (bit_count % 3) ? tmp.emplace_back(1) : tmp.emplace_back(0); } int num = 1; int result = 0; for(const int &digit : tmp){ if(digit){ result += num; } num <<= 1; } return result; }
Python Code:
# func: find the single number in a list # @param A: input list # @return: single number def single_numer(A): if not A: return 0 digits = [] for i in xrange(32): curr = 1 << i digit_count = 0 for num in A: if num & curr: digit_count += 1 if digit_count % 3: digits.append(1) else: digits.append(0) result = 0 bit_helper = 1 for digit in digits: if digit == 1: result += bit_helper bit_helper <<= 1 if digits[-1] == 1: return result - (1 << 32) else: return result
No comments:
Post a Comment