这是一道看完答案会觉得很简单,但做之前很难想到答案的题目!!!

不信?

Let us go !

题目描述

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]

示例 2:

输入: [4,1,2,1,2]


查看答案之前,不妨独立思考一下,看看能不能想出解决方案:)


题目解析

根据题目描述,由于加上了时间复杂度必须是O(n),并且空间复杂度为O(1)的条件,因此不能用排序方法,也不能使用map数据结构。

小吴想了一下午没想出来,答案是使用 位操作Bit Operation 来解此题。

将所有元素做异或运算,即a[1] ⊕  a[2] ⊕  a[3] ⊕ …⊕  a[n],所得的结果就是那个只出现一次的数字,时间复杂度为O(n)。

异或

异或运算A ⊕  B的真值表如下:

A

B

F

F

F

F

T

T

T

F

T

T

T

F

动画演示


进阶版

有一个 n 个元素的数组,除了两个数只出现一次外,其余元素都出现两次,让你找出这两个只出现一次的数分别是几,要求时间复杂度为 O(n) 且再开辟的内存空间固定(与 n 无关)。

示例 :

输入: [1,2,2,1,3,4]

题目再解析

根据前面找一个不同数的思路算法,在这里把所有元素都异或,那么得到的结果就是那两个只出现一次的元素异或的结果。

然后,因为这两个只出现一次的元素一定是不相同的,所以这两个元素的二进制形式肯定至少有某一位是不同的,即一个为 0 ,另一个为 1 ,现在需要找到这一位。

根据异或的性质 任何一个数字异或它自己都等于 0,得到这个数字二进制形式中任意一个为 1 的位都是我们要找的那一位。

再然后,以这一位是 1 还是 0 为标准,将数组的 n 个元素分成两部分。

  • 将这一位为 0 的所有元素做异或,得出的数就是只出现一次的数中的一个

  • 将这一位为 1 的所有元素做异或,得出的数就是只出现一次的数中的另一个。

这样就解出题目。忽略寻找不同位的过程,总共遍历数组两次,时间复杂度为O(n)。

动画再演示


End

本题的基础版来源于 LeetCode 第 136 号问题:只出现一次的数字。虽然题目难度是 简单,但解法真的很巧妙。感兴趣的同学可以根据思路去回答一下:https://leetcode-cn.com/problems/single-number/

推荐阅读

今日问题

谈一下小时候和长大了有什么变化?

打卡格式:打卡第n天,答:...

一道让你拍案叫绝的算法题相关推荐

  1. 一道关于老鼠繁衍的算法题

    题目源头 这道题目是前些日子,面试阿里的时候,给的一道在线测评算法题 题目描述 大海中央的一座孤岛,上面本来没有老鼠.有一艘路过的船只在附近沉没了,船上 x 对 新出生的老鼠,顺着船只残骸漂流到小岛上 ...

  2. 一道解决的非常漂亮的算法题

    这是多年以前做的一道题目,原题来自软件报或者电脑报 ,我记不清了.解决这个题目有一个关键的步骤,就是要求一个整数在一个整数三角阵中的坐标.这篇blog就是讨论这个求坐标的问题,不是讨论那个报纸上的题目 ...

  3. 一道很简单的贪心算法题~【贪心:我不要脸的伐?】

    文章目录 题目描述 输入 输出 样例输入 样例输出 C语言代码实现 思路 排序 处理 完整代码 C++代码实现 排序 完整代码 彩蛋 题目描述 小健有一家自己的商店,主营牛奶饮品,最近资金紧张,他想以 ...

  4. 一道求因子之和面试算法题

    package com.project;/*一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程 找出1000以内的所有完数.(因子:除去这个数本身的其它 ...

  5. 力扣高频算法php_互联网公司最常见的面试算法题有哪些?

    很多时候,你即使提前复习了这些最常见的面试算法题,你依旧无法通过算法面试! 为什么?你在提前准备复习的时候,在网上找了半天相应题目的分析文章,但你看了就是不懂. 你在面试的时候,卡壳了,一时间忘了怎么 ...

  6. 如何出(改编)一道ACM算法题?

    本文背景 本人算法能力一般,但是为省赛和区域赛网络赛出过几道题,总结了一些自己的经验,希望与大家分享.本文不涉及具体的算法题,都是一些理论性的想法和一些建议. 题源 如果你能在没有题源的情况下自己想出 ...

  7. 一天一道算法题--5.30---递归

    感谢微信平台:  一天一道算法题 --------每天多一点进步--------- 今天 休假 这题 也很水 能发现 规律就好 明天 再也不能这样了 forgive me ---------- 转载于 ...

  8. 一天一道算法题--6.15--卡特兰数

    感谢微信平台---一天一道算法题---每天多一点进步- problem: 12个高矮不同的人 排成两排 每排必须是从矮到高排列 而且第二行比对应的第一排的人高 问排列方式有多少种? analyse: ...

  9. 一道算法题跟大家分享

    无意中看到一道算法题,拿出我的解法与大家分享. 题目:输出1,2,3,4四个数字能组成的互不相同且无重复的三位数并统计满足条件的三位数个数 大家先想想,再看答案吧. View Code 1 /// & ...

最新文章

  1. 收藏 | 计算机网络基础知识总结
  2. 200901阶段一C++类和对象
  3. SAP OData:How is note $expand being implemented
  4. php中ci的session自动加载报错
  5. libmysql.dll是否真的要拷贝到c:\windows目录下呢?
  6. python安装json模块_python 标准模块之json 模块
  7. 嵌入式 U 盘自动挂载
  8. 网络对抗技术——密码破解技术
  9. java delayqueue_Java DelayQueue size()用法及代码示例
  10. R语言--异常值检测
  11. python函数(一)——def语句,作用域和参数
  12. java method field_java_解析Java中的Field类和Method类,Field类 Field类中定义了一些方 - phpStudy...
  13. 为什么每个语言都要和Java作比较?一文带你搞懂!
  14. Canvas 绘制点线相交
  15. 如何删除360奇安信软件
  16. Speex Acoustic Echo Cancellation (AEC) 回声消除模块的使用
  17. 常用企业邮箱用哪个好
  18. vue bus传值(带参数),调用组件之间的方法
  19. 怎么翻译截图里面的文字?快来看看截图翻译怎么弄
  20. STM32模拟串口驱动(带校验位)

热门文章

  1. android aliasactivity作用,android activity-alias 的作用
  2. 2021年移动云API应用创新开发大赛火热开启!
  3. 面试90%都会翻车的高可用+高并发+负载均衡架构设计 !
  4. 揭开「拓扑排序」的神秘面纱
  5. 比特大陆发布第三代AI芯片,INT8算力达17.6Tops
  6. 评分9.7!这本Python书彻底玩大了?程序员:真香!
  7. 《中国人工智能ABC人才发展报告》发布,算法和应用类人才短缺
  8. 汉语转拼音工具、新华字典API——两个支持Python的中文资源
  9. OMG:为什么用了索引,查询还是慢?
  10. 虽然这些代码很少,就几行,但却很牛逼!