268. Missing Number

一、题目

  1、审题

  

  2、分析

    求出一个数组中连续的元素中缺失的那一个。

 

二、解答

  1、思路

    方法一、

      将数组中的元素与下标进行对应。最终与下标不一致的元素即为缺失德那一个。

    public int missingNumber(int[] nums) {
        int end = nums.length - 1;
        for (int start = 0; start <= end; start++) {
            if(nums[start] > end || nums[start] == start)
                continue;
            int tmp = nums[start];
            nums[start] = nums[tmp];
            nums[tmp] = tmp;
            start--;
        }
        
        for (int start = 0; start <= end; start++) {
            if(nums[start] != start)
                return start;
        }
        return end + 1;
    }

 

  方法二、

    采用异或 ^ 运算符。将下标与元素值一起做 ^ 操作。出现了两次的元素最终会被消去,只剩下要求的出现一次的元素。

    public int missingNumber2(int[] nums) {
        int re = 0, i = 0;
        for (i = 0; i < nums.length; i++) 
            re = re ^ i ^ nums[i];
        
        return re ^ i;
    }

 

  方法三、

    采用求和方法。假若元素全部连续,将他们求和后再减去出现的元素值,剩下的即为未出现的元素值。

    public int missingNumber3(int[] nums) {
        int len = nums.length;
        int sum = (0 + len) * (len + 1) / 2;
        for (int i = 0; i < len; i++) 
            sum -= nums[i];
        return sum;
    }

 

  方法四、

    先将数组排序,在采用二分法查找缺失德元素。排序后下标与元素值相等,则该元素及前部分都是完整的部分。若该元素与下标不对应,则缺失德元素在前部。

    public int missingNumber4(int[] nums) {
        Arrays.sort(nums);
        int left = 0, right = nums.length, mid = (left + right) / 2;
        while(left < right) {
            mid = (left + right )/ 2;
            if(nums[mid] > mid) 
                right = mid;
            else 
                left = mid + 1;
        }
        return left;
    }

 

posted @ 2018-11-22 13:30  skillking2  阅读(167)  评论(0编辑  收藏  举报