LeetCode#136. Single Number

来源:互联网 发布:网络教育怎么样 编辑:程序博客网 时间:2024/06/15 14:44
  • 题目:一个数组中,只有一个元素只出现一次,其余元素都出现两次,找出出现一次的这个元素(时间复杂度要求为o(logn) 空间复杂度要求为o(1))
  • 难度:Easy
  • 思路:

    • 方法一:先将数组排序,然后通过二分查找来找到single number,有序数组查找single number:LeetCode#540
    • 方法二:通过位运算来找出single number(这个方法实在神奇)

      0 ^ N = NN ^ N = 0 那么N1 ^ N1 ^ N2 ^ N2 ^..............^ Nx ^ Nx ^ N= (N1^N1) ^ (N2^N2) ^..............^ (Nx^Nx) ^ N= 0 ^ 0 ^ ..........^ 0 ^ N= N
  • 代码:
    方法一的代码实现

public class Solution {    public int singleNumber(int[] nums) {        if(nums == null || nums.length == 0){            return -1;        }        int len = nums.length;        //len为1的情况需要单独考虑        if(len == 1){            return nums[0];        }        Arrays.sort(nums);        int left = 0;        int right = len-1;        while(left <= right){            int mid = left + (right-left);            if(mid == 0){                if(nums[mid] == nums[mid+1]){                    left = 3;                }else{                    return nums[mid];                }            }else if(mid == len-1){                if(nums[mid] == nums[mid-1]){                    right = len-3;                }else{                    return nums[mid];                }            }else{                //看mid位置的值和两边的值是否相等               if(nums[mid] != nums[mid-1] && nums[mid] != nums[mid+1]){                   return nums[mid];               }else if(nums[mid] == nums[mid-1]){                   if(mid%2 == 1){                       left = mid+1;                   }else{                       right = mid-2;                   }               }else{                   if(mid%2 == 1){                       right = mid-1;                   }else{                       left = mid+2;                   }               }            }        }        return nums[right];    }}

位运算的代码实现

public class Solution {    public int singleNumber(int[] nums) {        if(nums == null || nums.length == 0){            return -1;        }        Arrays.sort(nums);        int result = nums[0];        int len = nums.length;        for(int i = 1; i < len; i++){            result ^= nums[i];        }        return result;    }}
原创粉丝点击