落单的数

来源:互联网 发布:linux ls查看文件大小 编辑:程序博客网 时间:2024/06/07 11:52

给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字。


样例

给出 [1,2,2,1,3,4,3],返回 4

挑战 

一次遍历,常数级的额外空间复杂度


方法一: 首先想到的是对数组进行排序,然后扫描一遍让当前数跟左边和右边的数比较,第一个数和最后一个数要额外考虑

public int singleNumber1(int[] A) {        if (A.length == 0) return 0;        quickSort(A, 0, A.length - 1);        for (int i = 0; i < A.length - 1; i++) {            if (i == 0 && A[i] != A[i + 1] || i != 0 && A[i - 1] != A[i] && A[i] != A[i + 1]) {                return A[i];            }        }        return A[A.length - 1];    }    public void quickSort(int[] nums, int left, int right) {        int l = left, r = right;        if (left > right) return;        int key = nums[left];        do {            while (l < r && key < nums[r]) r--;            if (l < r) nums[l++] = nums[r];            while (l < r && key > nums[l]) l++;            if (l < r) nums[r--] = nums[l];        } while (l != r);        nums[l] = key;        quickSort(nums, left, r - 1);        quickSort(nums, l + 1, right);    }

方法二: 异或运算

public int singleNumber(int[] A) {        int result = 0;        for (int i = 0; i < A.length; i++) {            result ^= A[i];        }        return result;    }


原创粉丝点击