LeetCode17.04. 消失的数字

消失的数字

  • 题目描述:

    数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在 O(n)时间内完成吗?

分析:这里提供两种比较比较好的思路。

  1. 题目中的数组是从0 — n,少其中一个数字,则对0—n个连续数求和在逐个减去原数组中的数,即可得到缺失的数字。
//Leetcode题目环境
class Solution {
    public int missingNumber(int[] arr) {
        //获得数组的n项和
        int sum = (arr.length + 1)*(arr.length) / 2;

        for (int i = 0; i < arr.length; i++) {
            sum = sum - arr[i];
        }
        return sum;
    }
}

leetcode实验结果如下
LeetCode17.04. 消失的数字_第1张图片

//Intellij IDEA环境下的代码
package Learning;

public class test01 {
    public static void main(String[] args) {
        /*
        示例 1:

        输入:[3,0,1]
        输出:2
        */


        /*
        示例 2:

        输入:[9,6,4,2,3,5,7,0,1]
        输出:8
        */
        int[] arr1 = {3, 0, 1};
        int[] arr2 = {9, 6, 4, 2, 3, 5, 7, 0, 1};
        System.out.println(missingNumber(arr1));
        System.out.println(missingNumber(arr2));


    }

    public static int missingNumber(int[] arr) {
        //获得数组的n项和

        int sum = (arr.length + 1) * (arr.length) / 2;

        for (int i = 0; i < arr.length; i++) {
            sum = sum - arr[i];
        }
        return sum;
    }
}

实验结果其实是相同的
LeetCode17.04. 消失的数字_第2张图片

  1. 异或法:一个数和另一个书连续异或两次得到的是这个数的本身,这是显然的
//Leetcode环境下
//第二种方法,采用异或
class Solution {
    public int missingNumber(int[] arr) {
        int x = 0;
        for (int i = 0;i <= arr.length;i++){
            x ^= i;  //先和完整的数组的数异或
            }

        for (int i = 0;i < arr.length;i++){
            //再和arr中的数异或
            //如果i数存在,那么这一轮下来i依然为0
            x ^= arr[i];
        }
        return x;
            
        }
        
    }

实例执行结果如下:
LeetCode17.04. 消失的数字_第3张图片

你可能感兴趣的:(LeetCode,java,leetcode,算法)