腾讯/微软 面试题(异或运算)

题目1:

一个整型数组里除了1个数字出现 奇数次 外,其他数字都出现 偶数次 ,请找出 只出现奇数次的 这个数。

要求: 时间复杂度 O(n) ,空间复杂度 O(1)。


解题思路: 

1、我们知道 2个相同的数异或的结果为0, 所以我们将这n个数从头到尾 异或一遍得到结果x

2、于是乎,我们便得到了结果……


题目2:

一个整型数组里除了两个数字出现 奇数次 外,其他数字都出现 偶数次 ,请找出 只出现奇数次的 这两个数。

要求: 时间复杂度 O(n) ,空间复杂度 O(1)。


解题思路: 

根据题目1,我们可以想到,能不能将这两个数分开呢……


1、我们将这n个数从头到尾 异或一遍得到结果x(假设这两个数为a和b, 则a^b == x)

2、找到x的二进制表示中不为0的某一位,位置为y,然后将这n个数分成两类:y位置为1和y位置为0

3、将这两类数分别异或得到两个数a1和b1,便是我们所要求得结果


{

首先出现奇数次的这两个数肯定是不相等的,

所以两个出现奇数次的数在y位置上的二进制表示肯定是不同的,

否则y位置的结果不可能为1。

这样便将这两个数分开了。

又因为,每一类数中的其他数异或之后肯定为0,

所以,便得到结果啦……

}



题目3:

给你1到n这n个数,无序,现将其中一个数x改变成y,找出这两个数

要求: 时间复杂度 O(n) ,空间复杂度 O(1)。



解题思路:

刚开始想排序,不过O(n)的复杂度,很难(⊙o⊙)哦 ,根据上一题,可以这么考虑:
相当于我们有了两个数组,题目中所给的一个和从1到n这个有序的数组,然后就跟上一题一样~\(≧▽≦)/~啦啦啦


1、求出1到n的异或值x

2、继续将x与题目中所给的所有数值异或,得到新的x

3、根据x的二进制表示中不为0的某一位置y,然后将这n*2个数分成两:y位置为1和y位置为0

4、将这两类数分别异或得到两个数a和b,便是我们所要求得结果



  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值