Skip to content

Files

Latest commit

5ab2803 · Feb 25, 2023

History

History

0136.Single Number

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Feb 21, 2023
Feb 21, 2023
Feb 25, 2023
Nov 7, 2022
Nov 7, 2022
Nov 7, 2022
Nov 7, 2022
Nov 7, 2022
Feb 21, 2023
Feb 18, 2023
Feb 21, 2023

English Version

题目描述

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

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

 

示例 1 :

输入:nums = [2,2,1]
输出:1

示例 2 :

输入:nums = [4,1,2,1,2]
输出:4

示例 3 :

输入:nums = [1]
输出:1

 

提示:

  • 1 <= nums.length <= 3 * 104
  • -3 * 104 <= nums[i] <= 3 * 104
  • 除了某个元素只出现一次以外,其余每个元素均出现两次。

解法

方法一:位运算

异或运算的性质:

  • 任何数和 0 做异或运算,结果仍然是原来的数,即 x 0 = x
  • 任何数和其自身做异或运算,结果是 0 ,即 x x = 0

我们对该数组所有元素进行异或运算,结果就是那个只出现一次的数字。

时间复杂度 O ( n ) ,空间复杂度 O ( 1 ) 。其中 n 是数组 nums 的长度。

Python3

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        return reduce(xor, nums)

Java

class Solution {
    public int singleNumber(int[] nums) {
        int ans = 0;
        for (int v : nums) {
            ans ^= v;
        }
        return ans;
    }
}
class Solution {
    public int singleNumber(int[] nums) {
        return Arrays.stream(nums).reduce(0, (a, b) -> a ^ b);
    }
}

C++

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans = 0;
        for (int v : nums) ans ^= v;
        return ans;
    }
};

Go

func singleNumber(nums []int) (ans int) {
	for _, v := range nums {
		ans ^= v
	}
	return
}

JavaScript

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function (nums) {
    let ans = 0;
    for (const v of nums) {
        ans ^= v;
    }
    return ans;
};

TypeScript

function singleNumber(nums: number[]): number {
    return nums.reduce((r, v) => r ^ v);
}

Rust

impl Solution {
    pub fn single_number(nums: Vec<i32>) -> i32 {
        nums.into_iter().reduce(|r, v| r ^ v).unwrap()
    }
}

C

int singleNumber(int *nums, int numsSize) {
    int ans = 0;
    for (int i = 0; i < numsSize; i++) {
        ans ^= nums[i];
    }
    return ans;
}

Swift

class Solution {
    func singleNumber(_ nums: [Int]) -> Int {
        var a = nums.sorted()
        var n = a.count
        for i in stride(from: 0, through: n - 2, by: 2) {
            if a[i] != a[i + 1] {
                return a[i]
            }
        }
        return a[n - 1]
    }
}

...