leetcode136. 只出现一次的数字
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入:nums = [2,2,1]
输出:1
示例 2 :
输入:nums = [4,1,2,1,2]
输出:4
示例 3 :
输入:nums = [1]
输出:1
题目分析
题目要求找出数组中只出现一次的数字。其他数字都出现两次。这个问题可以通过位操作中的异或运算来解决。
异或运算有几个特性:任何数和自己做异或运算结果为0,任何数和0做异或运算结果还是自己,异或运算满足交换律和结合律。
算法步骤
- 初始化一个变量temp为0。
- 遍历数组中的每个数字。
- 将当前数字与temp做异或运算,结果赋值给temp。
- 遍历完成后,temp中存储的就是只出现一次的数字。
流程图
算法流程图
具体代码
class Solution {
public:
int singleNumber(vector<int>& nums) {
int temp=0;
for(int i=0;i<nums.size();i++)
{
temp=nums[i]^temp;
}
return temp;
}
};
算法分析
- 时间复杂度:O(n),其中n是数组长度。只需要遍历一次数组。
- 空间复杂度:O(1),只需要一个额外的变量来存储结果。
- 易错点:需要注意异或运算的性质,以及如何利用这些性质来解决问题。
- 注意点:此方法只适用于数组中只有一个数字出现一次,其他数字都出现两次的情况。
相似题目
题目 | 链接 |
---|---|
只出现一次的数字 II | 在这个题目中,除了一个数字只出现一次,其他数字都出现三次。 |
只出现一次的数字 III | 这个题目中有两个数字只出现一次,其他数字都出现两次。 |