常见面试算法题:N个数中寻找仅出现过1次的数
来源:互联网 发布:行程助手软件 编辑:程序博客网 时间:2024/06/10 00:53
最近有面试他人,感觉温习温习这些算法题还蛮有意思,因此单开一个系列进行回顾和探讨。
第一个算法题最原始的问题版本是:现有N个数,其中有1个数只出现了一次,其它数均出现了2次,要求找到这个仅出现过1次的数。要求空间复杂度为O(1)。
- 求解思路:异或法
根据异或的计算规则,两个相同的数做异或操作后结果为0,两个不同的数做异或操作结果绝对不为0,而任何数与0异或结果仍为自身。因此将给定的N个数从前至后依次做异或操作后,所有重复的数两两异或后均为0,只剩下那个只出现了1次的词,即为异或操作最后的结果。算法空间复杂度O(1),时间复杂度O(N)。
进化的问题版本是:现有N个数,其中有2个数只出现了1次,其它数均出现了2次,要求找到这两个仅出现过1次的数。要求空间复杂度为O(1)。
- 求解思路:数组划分+异或法
为保证算法空间复杂度为O(1),仍只能采用异或法的思路。但是原始版本算法直接应用存在的问题是,所有数做异或后得到的仅有一个数C,这个数就是那两个只出现了1次的数,记为A和B的异或结果。必须采用一定的策略使得问题又回复到原始版本,方可在O(1)的空间复杂度里解决,而策略的关键则是要将A和B划分到两个分开的子数组中。具体的策略为:由于C为A和B的异或操作结果,因此在C的二进制表达中,值为1的位置即为A和B的二进制位上取值不同的位置。只需要任意取其中的1位对原始的N的数组做划分,即能将A和B分到不同的子数组中。当这一步完成后,采用异或法对两个子数组分别做一遍异或操作即可得到A和B。空间复杂度O(1),时间复杂度仍为O(Nk),k为系统整型长度。
留下一个问题,如果将第二个版本的问题再次升级,在N个数中是有3个数仅出现了1次,其它数则均出现了2次,要如何找到这3个数呢?还能在O(1)的空间复杂度里解决么?
0 0
- 常见面试算法题:N个数中寻找仅出现过1次的数
- 在N个数中找出出现奇数次的数
- 从1到n的数中1出现的个数&&寻找丑数
- 数1-n个数中0-9出现过多少次
- 常见面试算法题:给定数组中寻找加和为特定数的两个数
- 经典算法-给出2n+1个数,其中有2n个数出现过两次,用简便的最方法求出现一次的数
- 腾讯面试中一道算法题:一个数N 的2进制表现形式中1的个数
- 算法题/数组中出现1次的两个数
- 数组中每个数会出现3次,只有1个例外的数仅出现1次。 Single Number
- n个数出现2次,2个数出现1次,找出这两个数
- 有2n+1个数,其中有2n个数出现过两次,找出其中只出现一次的数
- 有2n+1个数,其中有2n个数出现过两次,找出其中只出现一次的数
- 有2n+1个数,其中有2n个数出现过两次,找出其中只出现一次的数
- 有2n+1个数,其中有2n个数出现过两次,找出其中只出现一次的数
- 有2n+1个数,其中有2n个数出现过两次,找出其中只出现一次的数
- 有2n+1个数,其中有2n个数出现过两次,找出其中只出现一次的数
- 有2n+1个数,其中有2n个数出现过两次,找出其中只出现一次的数
- 在其它数都出现偶数次的数组中寻找出现奇数次的数
- [网易云课堂]Linux内核分析(六)—— 分析Linux内核创建一个新进程的过程
- MySQL Connector/C++ 例子(二)
- 2600 13号星期几?
- where,having与 group by连用的区别
- 整理:卷积的直观理解、物理意义与本质(四)
- 常见面试算法题:N个数中寻找仅出现过1次的数
- 算法: 快速求中位数(第k大数)
- openVR驱动接口之IServerDriverHost简介
- docker 启动安装等命令
- 关于get和post网络请求的方式和formid的应用。
- 2.5输入多个字符串,存入数组,然后按照字符串的大小重新升序排列
- python学习之正则表达式
- 名校和非名校最重要差距,悄悄影响着我们的一生
- iOS之图片缩放的集中方法