LeetCode上的初级题目,刚刚开始学习算法,从初级入门开始。
题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
思路描述:
1.在看到这个题目时第一反应是先对数组进行排序,排序完成后直接遍历,如果相邻两个数字不相同则说明有不同的数字。代码大致如下:
int singleNumber(vector<int>& nums) {
int tmp = 0;
sort((), ());
for (int i = 0; i < (); i+=2) {
if (nums[i] != nums[i + 1])
{
tmp = nums[i];
break;
}
}
return tmp;
}
但是这种算法的时间复杂度主要取决于sort函数的复杂度,并不是一个简单的算法。
2.第二种算法就简答了很多,我们可以考虑用异或的性质解决,一个数字异或它自己结果为0,异或0结果为它自己即a^a=0,a^0=a,且异或满足a^b^c=a^(b^c)。因此我们可以设置一个ret异或每个数组元素,最后相同的都抵消为0,那个唯一的数字异或0为它自己即为答案。
代码如下:
int singleNumber(vector<int>& nums) {
int tmp = 0;
for(int i = 0;i < ();i++){
tmp = tmp ^ nums[i];
}
return tmp;
}
可见这种方法简洁而又高效,时间复杂度为n。