Skip to content

Files

Latest commit

c29b144 · May 17, 2024

History

History

0136.Single Number

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
May 17, 2024
May 17, 2024
Jan 13, 2024
Jan 13, 2024
Jan 13, 2024
Nov 7, 2022
Nov 7, 2022
Jun 17, 2023
Nov 7, 2022
Nov 9, 2023
Jan 13, 2024
Feb 21, 2023
Jan 13, 2024
comments difficulty edit_url tags
true
简单
位运算
数组

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 是数组 n u m s 的长度。

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;
    }
}

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
}

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()
    }
}

JavaScript

/**
 * @param {number[]} nums
 * @return {number}
 */
var singleNumber = function (nums) {
    return nums.reduce((a, b) => a ^ b);
};

C#

public class Solution {
    public int SingleNumber(int[] nums) {
        return nums.Aggregate(0, (a, b) => a ^ b);
    }
}

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 {
        return nums.reduce(0, ^)
    }
}

方法二

Java

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