single number和变体
给array of integers.
裡面有一个数字是单独出现 其他都会出现两次(而且一起出现)
ex: [1,2,2,3,3]
要判断哪个数字是单独出现的.
以这个例子的话就是 1
裡面有一个数字是单独出现 其他都会出现两次(而且一起出现)
ex: [1,2,2,3,3]
要判断哪个数字是单独出现的.
以这个例子的话就是 1
LZ 一开始先说了用HashMap 去记出现几次
面试官说有没有不用额外空间的方式
我说 那就用XOR 去算吧 剩下来的那个就是单独出现的了 複杂度是O(N)
面试官说可以,但是希望再想其他方式可以优化的 比如说O(logN)複杂度
看到logN就想到binary serach了
不过一时没有想到怎麽个search法
面试官给了提示才推出来的
结论就是用index是基数或偶数 来判断 search砍半时应该往前找或往后找
面试官说有没有不用额外空间的方式
我说 那就用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
那个单独的数一定是在奇数个中