这道题目的意思大概是这样:
给我一个整型数组,里面的元素都出现两次,但是有一个元素只出现一次,你要把这个只出现一次的元素给找出来。并且要求算法的时间复杂度为线性,即O(N)。
一开始我思考了很久,始终没有找到方法。若是不限定元素类型为整型,那么根本不可能在线性时间内找到这个只出现一次的元素。所以我想突破点应该在于元素类型为整型。
为什么整型就可以做到在线性时间内得出结果呢?我点开了该题目所属的标签,【Bit Manipulation】——位操作。好像突然间抓住了什么,位操作是个很神奇的东西,它的背后隐藏着布尔代数的哲学。记得在刚开始学编程的时候,交换a、b两个数可以用三次异或完成,当时始终想不通为什么。
所以这道题目的突破口已经找到了,常见的位操作有“掩码”,和 1 进行 & 操作,结果不变,和 0 进行 & 操作,该位置为 0 。而这道题要用的位操作是“异或”,“异或”有两个特点:
1、一个数与任何一个数异或两次,结果为原来的数。
2、一个数与 0 进行异或,结果为原来的数。
啊!这么看来这道题的答案就出来了!
1 class Solution { 2 public: 3 int singleNumber(vector<int>& nums) { 4 int result = 0; 5 for (auto first = nums.cbegin(); first != nums.cend(); first++) { 6 result ^= *first; 7 } 8 return result; 9 } 10 };
时间: 2024-12-31 03:30:04