【leetcode】Single Number 1 & 2

简介

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

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

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

题一

这一题里,所有元素都是成对出现,除了那个需要寻找的元素之外。举个例子,数组中有三个元素{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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值