single number和变体

给array of integers
裡面有一个数字是单独出现  其他都会出现两次(而且一起出现)
ex: [1,2,2,3,3]
要判断哪个数字是单独出现的
以这个例子的话就是 1
LZ 一开始先说了用HashMap 去记出现几次
面试官说有没有不用额外空间的方式
我说 那就用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

那个单独的数一定是在奇数个中

posted @ 2018-10-15 22:05  有梦就要去实现他  阅读(177)  评论(0编辑  收藏  举报