zoukankan      html  css  js  c++  java
  • 0268. Missing Number (E)

    Missing Number (E)

    题目

    Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array.

    Example 1:

    Input: [3,0,1]
    Output: 2
    

    Example 2:

    Input: [9,6,4,2,3,5,7,0,1]
    Output: 8
    

    Note:
    Your algorithm should run in linear runtime complexity. Could you implement it using only constant extra space complexity?


    题意

    给定一个长度为n的数组,从 0-n 这 n+1 个数中选取 n 个数填充入数组中,找到缺失的那一个数。

    思路

    交换法:第一次遍历数组,将nums[i]与下标为nums[i]的数进行交换,第二次遍历数组,如果遇到 i != nums[i],说明i就是缺失的数。

    求和法:先求 0-n 的和,再求数组中数的和,相减就是缺失的数。

    异或法:根据相同的数异或为0的性质, 将数组中所有数异或一遍,再将结果与 0-n 异或一遍,相同的数会互相抵消,得到的结果就是缺失的数。


    代码实现

    Java

    交换

    class Solution {
        public int missingNumber(int[] nums) {
            int i = 0;
            while (i < nums.length) {
                if (nums[i] >= nums.length || nums[i] == i) {
                    i++;
                } else {
                    swap(nums, i, nums[i]);
                }
            }
            for (int j = 0; j < nums.length; j++) {
                if (nums[j] != j) {
                    return j;
                }
            }
            return nums.length;
        }
    
        private void swap(int[] nums, int i, int j) {
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }
    }
    

    求和

    class Solution {
        public int missingNumber(int[] nums) {
            int len = nums.length;
            int sum1 = (len + 1) * len / 2;
            int sum2 = 0;
            for (int num : nums) {
                sum2 += num;
            }
            return sum1 - sum2;
        }
    }
    

    异或

    class Solution {
        public int missingNumber(int[] nums) {
            int res = 0;
            for (int i = 0; i < nums.length; i++) {
                res = res ^ nums[i] ^ (i + 1);
            }
            return res;
        }
    }
    
  • 相关阅读:
    Python 多线程,文件io
    Python map/reduce函数式编程
    LeetCode 77 组合
    LeetCode 198 打家劫舍
    LeetCode 138 复制带随机指针的链表
    LeetCode 445 两数相加 II
    LeetCode 2 两数相加
    LeetCode 215 数组中的第K个最大元素
    和为S的两个数字
    数组中重复的数字
  • 原文地址:https://www.cnblogs.com/mapoos/p/13150373.html
Copyright © 2011-2022 走看看