今天在学刷力扣的题的时候遇到一个很有意思的题目:
刚开始拿到这个题的时候,我的想法其实暴力破解,还是想要用利用一个时间复杂度较好的排序算法先排序,然后在进行遍历查找那一个元素,但是显然,在一般情况下的排序算法最好的时间复杂度也是nlogn,所以我就陷入困惑。。。
但是在看了大神的代码后,突然回忆起来曾经学过的位运算,也许能解决这道题目。
首先抬出与本题相关的位运算的基本公式:
有了上述的公式可以很好地得到最后只出现一次的元素,具体做法如下。
例如:{1,3,3,1,6,6,5}(为了方便看懂,我把十进制数字转换为对应的二进制)
第一步: 000 ^ 001 = 001
第二步: 001 ^ 011 = 010
第三步: 010 ^ 011 = 001
第四步: 001 ^ 001 = 000
第五步: 000 ^ 110 = 110
第六步: 110 ^ 110 = 000
第七步: 000 ^ 101 = 101
所以最后的答案就是101!
最后附上我使用C语言的代码!
int singleNumber(int* nums, int numsSize){
int i;
int k = 0;
for(i = 0;i<numsSize;i++)
{
k = k^nums[i];
}
return k;
}
也算是今天学习的感悟,才开始刷题,感觉很有意思!希望以后也能多多收获知识!