码迷,mamicode.com
首页 > 其他好文 > 详细

我也来刷LeetCode——1、Single Number

时间:2015-08-26 19:40:03      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:

  这道题目的意思大概是这样:

  给我一个整型数组,里面的元素都出现两次,但是有一个元素只出现一次,你要把这个只出现一次的元素给找出来。并且要求算法的时间复杂度为线性,即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 };

 

我也来刷LeetCode——1、Single Number

标签:

原文地址:http://www.cnblogs.com/huangmingchuan/p/4760703.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!