【leetcode】Single Number 1 & 2

来源:互联网 发布:sybase数据库如何备份 编辑:程序博客网 时间:2024/06/08 14:14

简介

这两个题都要求从整数数组中找出唯一的元素。我们第一反应可以采用排序加遍历的方式来处理。

但是题目要求线性的时间复杂度和尽可能小的空间复杂度。排序遍历的方式就不可行了。

如果了解计算机是如何表示一个整数的,那么这两道题就不难了。

题一

这一题里,所有元素都是成对出现,除了那个需要寻找的元素之外。举个例子,数组中有三个元素{1, 2, 2}。这三个数在计算机中的表示为:

1 表示为  00000000 00000000 00000000 00000001

2 表示为  00000000 00000000 00000000 00000010

每个位上1的总数目是2*m个或者2*m+1个,将这些数异或,两个1异或,结果为0。所以,最终结果唯一,且就是我们要找的数。


这道题可以衍生为,一个整数数组中有n个元素,其中只有一个出现一次,其他恰好出现n(n为偶数)次,求出现一次的那个元素。


代码如下:

<span style="font-family:Courier New;">class solution {public: int singleNumber(int A[], int n) {int x = A[0];for (size_t i = 1; i < n; ++i)x ^= A[i];return x;}};</span>

题二

这一题里,所有元素都出现三次,除了要找的那个元素。出现,三次,异或就没有意义了。但是原理与上一题类似。

举个例子:数组中有四个元素{1, 2, 2, 2}。这三个数在计算机中的表示为:

1 表示为  00000000 00000000 00000000 00000001

2 表示为  00000000 00000000 00000000 00000010

每个位上1的总数目是3*m个或者3*m+1个,多余的这个1就是我们需要的。我们只需要依次找出第i(0<i<sizeof(int)*8)位上,是否多余了1,那么最终就能获得答案。


这种解法可以解决所有每个元素出现n(n任意)次,其中一个元素除外的问题。


代码如下:

<span style="font-family:Courier New;">class Solution {public:int singleNumber3(int A[], int n) {const int w = sizeof(int)*8;int res = 0;for (int i = 0; i < w; ++i) {int bit = 0;for (int j = 0; j < n; ++j) {if ((A[j] >> i) & 1)bit++;}res += ((bit % 3) << i);}return res;}};</span>


0 0
原创粉丝点击