原文链接:http://www.cnblogs.com/baiyanhuang/archive/2010/06/23/1763981.html


有 1 到 10000 共 10000 个数,如果我从中随机拿走一个数,你如何知道我拿走了哪个?

相信很多人看过这道题,并知道答案,这几天和同事聊天时听到了这个问题,因为有过自己的思考过程,不妨记录下来。 说是逻辑题,其实也算是一道算法题,同事先讲了下他被面试中的思维过程:

  1. 先把 10000 个数相乘,然后再将拿走一个数之后的 9999 个数相乘,两者相除即可。

    这个算法是正确的,但是会有两个潜在的问题:

    • 如此多的数相乘,其范围必然会超出系统提供的数据类型支持,当然你可以实现自己的大数表示的算法,但那样性能必然有影响。
    • 假设扩展一下题目,提供的数组中有 0 的话,乘法就不可用了。
  2. 针对前面提出的问题,同事想到了使用加法,先求出 10000 个数的和,再减去 9999 个数的和。

    这样数据不会溢出,而且加法的效率比乘法也要高很多,即使数据中包含 0,也没有任何问题。

然后就过关了,自己回去之后思考了一下,觉得还可以扩展,假设所有的数加起来之后仍然会溢出,那该如何处理,比如从 1 到 (264-1),于是想到了位操作,与、或,异或中,要数异或最为神奇,代入一看,果然合适: 先将所有的数异或起来,然后将拿走一个数之后的数异或起来,两者结果再异或,便是拿走的那个数。

我用 a,b,c,d 4 个数来做演示,因为异或符合结合律和交换律(你可以用 0,1 试一下),于是:

a^b^c^d = (a^b^c)^d
d = (a^b^c^d)^(a^b^c)

此处用异或的好处在于

  1. 不会溢出
  2. 异或的速度要快于加法

扩展一下题目,如果提供的不是整数,而是浮点数,会有问题吗? 当然没有,因为是在位级别上操作,无论是整数还是浮点数,在这个算法看来,都是一堆位,处理起来没有什么差别。

再扩展一下题目,如果提供的数本身就超出了内置类型的表示范围,如在 1 到 2128,该如何处理? 这个问题是在写这篇文章的过程中想到的,暂时没有好的办法。

在 github 上关注我:https://github.com/justjavac

一道逻辑题 - 我拿走了哪个数相关推荐

  1. 转载:一道逻辑题 房间里有100盏电灯

    转自:程序猿_哲 一道挺有意思的逻辑题 房间里有100盏电灯,编号为1,2,3--100,每盏灯上有一个按钮,初始时灯全都是关的.        编好号的100位同学由房间外依次走进去,将自己编号的倍 ...

  2. 截止目前为止,我遇到的最难的一道算法题:计算相邻两个数的最大差值

    hello,今天给大家带来一道算法题.这道算法题,是我目前为止,见过最难的一道题.那么到底是怎样的一道算法题呢?如下: 题目:给定一个数组, 求如果排序之后, 相邻两数的最大差值. 要求时间复杂度O( ...

  3. 一道逻辑题 房间里有100盏电灯

    在 博客园看到的这个问题,也想做一下.题目是这样的 房间里有100盏电灯,编号为1,2,3--100,每盏灯上有一个按钮,初始时灯全都是关的.编好号的100位同学由房间外依次走进去,将自己编号的倍数的 ...

  4. 一道经典面试逻辑题的python解法

    前言: 好早之前看到的一个逻辑题:有两个2到99之间的整数,a知道这两个数的和,b知道这两个数的积. 第一句:a对b说:我不知道这两个数是多少,但我确信你也不知道. 第二句:b说:我知道了. 第三句: ...

  5. 前端面试常见逻辑题收集及分析

    前端面试中常出现一些有趣的逻辑题,初见的时候有可能会手足无措,但实际多看几个题之后就会有一定的思考逻辑,有种打通任督二脉的感觉.以下是我个人面试经历以及网络上收集来的一些经典题目. 题目: 1.现有一 ...

  6. 网络中超难的75道逻辑题及答案

    网络中超难的75道逻辑题及答案 [1]假设有一个池塘,里面有无穷多的水.现有2个空水壶,容积分别为5升和6升.问题是如何只用这2个水壶从池塘里取得3升的水. 由满6向空5倒,剩1升,把这1升倒5里,然 ...

  7. 应聘必看——75道逻辑题答案

    应聘必看--75道逻辑题答案 [1]    假设有一个池塘,里面有无穷多的水.现有2个空水壶,容积分别为5升和6升.问题是如何只用这2个水壶从池塘里取得3升的水. 由满6向空5倒,剩1升,把这1升倒5 ...

  8. 刷1000遍奥数题,不如学会这几道逻辑题,让孩子秒懂数学,学习早开窍!

    ▲ 点击查看 前阵子发现一个英国BBC制作的纪录片,叫<逻辑的乐趣>(The Joy Of Logic),介绍了逻辑的概念,逻辑的发展史,及其在现实生活中的应用和价值. 讲解非常有意思,深 ...

  9. 大数据面试 逻辑题

    逻辑题大致分为比较逻辑题.分析逻辑题.综合逻辑题.抽象逻辑题.概括逻辑题.推理逻辑题.论证逻辑题等,由于这类题比较考验综合素质,因此也一直是各大企业笔试.面试时经常喜欢考察的题目类型之一.很多童鞋认为 ...

最新文章

  1. 【自然框架】之“元数据”的威力
  2. 【语言处理与Python】1.4回到Python:决策与控制
  3. Awk by Example--转载
  4. ElasticSearch logo 分布式搜索引擎 ElasticSearch
  5. boost::histogram::axis::integer用法的测试程序
  6. JavaScript 开发的40个经典技巧
  7. WINCE6补丁安装
  8. C#LeetCode刷题之#717-1比特与2比特字符( 1-bit and 2-bit Characters)
  9. BLE4.0教程四 新增特征值(CC2541)
  10. PDA与服务器时间同步
  11. 如何更新 Ubuntu Linux
  12. 人月神话阅读笔记06
  13. 【C语言】07-基本语句和运算
  14. 智能制造与MES系统的内在联系
  15. mysql的分页——limit、offset
  16. Centos下rarcrack破解压缩包密码
  17. 品千秋之遗迹, 叹万世之须臾
  18. oracle 按天数 均值,oracle 按天数统计数据
  19. 李炎恢bootstrap做轮播器的方法与思路
  20. 成为一名合格的算法工程师需要掌握哪些技能?

热门文章

  1. 常用模拟低通滤波器的设计~经典 IIR 滤波器之巴特沃斯滤波器
  2. 2012年第三届C B组蓝桥杯省赛真题
  3. 【图像处理】一文弄明白图像配准(SIFT)
  4. QT MinGW 编译GDAL
  5. 【Anaconda】conda阿里云镜像源配置
  6. Redis - 慢查询
  7. 学习笔记(1):什么是网页、常用浏览器、Web 标准
  8. 培养儿童情商非常重要、让小孩认识情商、提高情商,情商培养要从娃娃抓起PPT
  9. 7-1 装箱问题 (50分)
  10. MYSQL数据库初窥门径, SQL语句地熟练使用, 图形化界面提高效率