给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]

输出: 1

示例 2:

输入: [4,1,2,1,2]

输出: 4

/**
 * @author zhang
 * 思路:
 * 因为只有一个数字出现了一次,所以我就写了几个判断
 * 先进行排序,有三种情况
 * 1.数组长度为1,直接返回
 * 2.nums[0]只出现一次 nums[num.length-1]只出现一次,这样就返回nums[0]或num[num.length-1]
 * 3.在中间,这样就通过判断和两边的是否相等,若不相等那么就是只出现一次
 */
public class Solution {
    public int singleNumber(int[] nums) {
        Arrays.sort(nums);
        if (nums.length == 1) {
            return nums[0];
        }
        if (nums[0] != nums[1]) {
            return nums[0];
        }
        if (nums[nums.length - 1] != nums[nums.length - 2]) {
            return nums[nums.length - 1];
        }
        for (int i = 0; i < nums.length - 2; i++) {
            if (nums[i] != nums[i + 1] && nums[i + 1] != nums[i + 2]) {
                return nums[i + 1];
            }
        }
        return 0;
    }

但是这样执行用时比较长

image-20220108004600496

参考了一下大佬的答案,了解了异或运算,确实很棒,不过我上面的思路和异或的思想大概是一样的,但是在此之前不了解异或运算

使用异或运算,将所有值进行异或
异或运算,相异为真,相同为假,所以 a^a = 0 ;0^a = a
因为异或运算 满足交换律 a^b^a = a^a^b = b 所以数组经过异或运算,单独的值就剩下了

优化后的代码,太强啦

/**
 * @author zhang
 * 思路:
 * 使用异或运算,将所有值进行异或
 * 异或运算,相异为真,相同为假,所以 a^a = 0 ;0^a = a
 * 因为异或运算 满足交换律 a^b^a = a^a^b = b 所以数组经过异或运算,单独的值就剩下了
 */
public class Solution {
    public int singleNumber(int[] nums) {
        int result = 0;
        for (int num : nums) {
            result = result ^ num;
        }
        return result;
    }

链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x21ib6/

最后修改:2022 年 01 月 12 日
点个赞或者请作者喝杯咖啡