裡面有一个数字是单独出现 其他都会出现两次(而且一起出现)
ex: [1,2,2,3,3]
要判断哪个数字是单独出现的.
以这个例子的话就是 1
面试官说有没有不用额外空间的方式
我说 那就用XOR 去算吧 剩下来的那个就是单独出现的了 複杂度是O(N)
面试官说可以,但是希望再想其他方式可以优化的 比如说O(logN)複杂度
看到logN就想到binary serach了
不过一时没有想到怎麽个search法
面试官给了提示才推出来的
结论就是用index是基数或偶数 来判断 search砍半时应该往前找或往后找
//XOR版本 class Solution { public: int singleNumber(vector<int>& nums) { int length = nums.size(); int num = 0; for(int i = 0;i < length;i++) num ^= nums[i]; return num; } }; class Solution{ public: int singleNumber(vector<int>& nums){ return single_core(nums,0,nums.size()-1); } int single_core(vector<int> nums,int start,int end){ if(start == end) return nums[start]; int length = end - start + 1; int mid = length/2; if((length/2)%2 == 0){ if(nums[i] == nums[i-1]) return single_core(nums,start,mid); if(nums[i] == nums[i+1]) return single_core(nums,mid,end); } else{ if(nums[i] == nums[i-1]) return single_core(nums,mid+1,end); if(nums[i] == nums[i+1]) return single_core(nums,start,mid-1); } } }
偶数:12233、22331
奇数:2233441、1223344
那个单独的数一定是在奇数个中