只出现一次的数字
- https://leetcode.cn/problems/single-number/description/
描述
-
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素
-
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间
示例 1
输入:nums = [2,2,1]
输出:1
示例 2
输入:nums = [4,1,2,1,2]
输出:4
示例 3
输入:nums = [1]
输出:1
提示
- 1 <= nums.length <= 3 * 1 0 4 10^4 104
- -3 * 1 0 4 10^4 104 <= nums[i] <= 3 * 1 0 4 10^4 104
- 除了某个元素只出现一次以外,其余每个元素均出现两次
Typescript 版算法实现
1 ) 方案1: 位运算
function singleNumber(nums: number[]): number {let ret = 0nums.forEach((item) => {ret ^= item // 相同的数字,异或完成后都会变成 0})return ret
};
2 ) 方案2: 基于Set (不推荐)
function singleNumber(nums: number[]): number {const set = new Set<number>();let singleNumbers: number[] = [];for (const num of nums) {if (set.has(num)) {set.delete(num); // 虽然在这个特定问题中这一步是多余的,但按照 C# 逻辑保持一致性} else {set.add(num);}}// 将集合转换为数组,并返回所有只出现一次的数字(在这个特定问题中应该只有一个)singleNumbers = Array.from(set);return singleNumbers[0]; // 假设只有一个只出现一次的数字
}