在黑板上写下50个数字:1至50。在接下来的49轮操作中,每次做如下操作:选取两个黑板上的数字a和b,擦去,在黑板上写|b-a|。请问最后一次动作之后剩下的数字可能是什么?为什么?(不用写代码,不写原因不得分)(阿里巴巴笔试题)

将题目通用化,即变成给定1..n这n个数字,操作到最后剩下的数字可能是什么。则原题即是n=50的特例。

首先我们有结论1:假设操作1..n,最后剩下的可能数字的个数为k,则操作1..(n+1)时,剩下数字的个数将大于等于k。这个结论简单的用反证法证明下——假设存在n,使得操作1..n时,剩下的数字个数k,操作1..(n+1)剩下可能数字的个数为p,且k>p。则令1..n时的k个数为a[1],a[2]…a[k],显然它们互不相等。则1..n+1时,如果最后使用数字n+1与a[1]…a[k]做操作,得到|a[1]-(n+1)| … |a[k]-(n+1)|,此时k=p,不满足假设,则假设不成立,原命题成立。

然后再来个结论2:操作1..n所有可能剩下的数字必定都小于等于n。这个显然成立,因为对任意非负数a,b,|b-a|<=max(a,b)必定成立。

开始解题。

对于操作1..n这n个数,若只观察它们的奇偶性,则会发现,当选取任意两个数a,b做操作时,若两个均为偶数,则结果也为偶;两个奇数,结果为偶;一奇一偶,结果为奇。而这点跟异或完全相同,即令0代表偶数,1代表奇数,则0^0=1^1=0,0^1=1^0=1。因此,当操作1..n时,其剩下数字的奇偶性就等于1^0^1^0…^1(n为奇)/0(n为偶),是个确定值,即剩下的数必定都为奇数或都为偶数(异或与顺序无关)。进一步发现,当1^0^1^0…式子中1的个数为奇数时,结果为1,即剩下的数必定都为奇数;1的个数为偶,结果为0,剩下的数字必定都为偶数。

因此我们有如下假设的结论:对于1..n,当┌n/2┐为奇数(┌n┐表示不小于n的整数)时,剩下的数字为1,3,5… 2i+1(其中2*i+1为小于等于n的最大奇数);当┌n/2┐为偶数时,剩下的数字为0,2,4…2*i(2*i为小于等于n的最大偶数)。

下面用数学归纳法证明该假设。

1).当n=3时,可能剩下的数字为0,2,假设成立;n=4时,剩下的数字为0,2,4,假设成立;n=5时,为1,3,5,假设成立。

2).假设当n=k时,假设成立。即1..k时,若┌k/2┐为奇,则为1,3,5…2*i+1;┌n/2┐为偶,则为0,2,4…2*i。则现在需证明n=k+1时,假设仍成立。

3).当n=k+1时,若此时┌k/2┐为奇时,则再分为两种情况:k为奇数,或k为偶数。当k为奇数时,1^0^1…^1=1,再异或偶数k+1,1^0=1,则此时操作1…k+1剩下的数字仍然均为奇数,再根据结论1和结论2可知,剩下数字的个数应大于等于n=k,且最大奇数不能大于偶数k+1,则唯一的可能就是1..k+1剩下的数字与1..k剩下的数字相同,此情况符合假设。当k为偶数时,1^0^…^0=1,再异或奇数k+1,1^1=0,则此时操作1..k+1剩下的数字均为偶数,但结论1,2要求其个数应该大于等于n=k时的个数,且最大数不能大于k+1,则唯一的可能就是0,2…k,此情况仍符合假设。最后┌k/2┐为偶的情况,也可根据该奇偶性和结论1,2易证得该假设成立。故n=k+1时,假设仍然成立。

4).最后回到题目上来,令n=50,则根据结论可知,可能剩下的数字为1,3,5…49。

[笔试题]黑板上写下50个数字,选两个黑板上数字a和b,在黑板写|b-a|,剩下的数字?的更多相关文章

  1. 剑指Offer面试题:21.从上到下打印二叉树

    一.题目:从上到下打印二叉树 题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印.例如输入下图中的二叉树,则依次打印出8.6.10.5.7.9.11. 二叉树节点的定义如下,采用 ...

  2. 【剑指Offer学习】【面试题23:从上往下打印二叉树】

    题目:从上往下打印出二叉树的每一个结点,同一层的结点依照从左向右的顺序打印. 二叉树结点的定义: public static class BinaryTreeNode { int value; Bin ...

  3. 《剑指offer》从上往下打印二叉树

    本题来自<剑指offer> 从上往下打印二叉树 题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 队列的思想. 先将根节点加入,当取该节点时候,依次将左右子树加入,直 ...

  4. 《剑指offer》— JavaScript(22)从上往下打印二叉树

    从上往下打印二叉树 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路 借助两个辅助队列,一个用来存放结点,一个用来存放结点值: 先将根节点加入到队列中,然后遍历队列中的元素,遍历 ...

  5. 去蓝港在线面试Unity3D的笔试题。难吗?知道答案的在评论里写出来分享

    前一阵子去蓝港面试unity3d程序,在前台登记以后被领到一个吧台前面填2张个人信息表,之后有人送来笔试题,做了1个小时,感觉挺难的.之后被带到下面面试,面试的是一个年龄稍大的(可能是项目经理或者技术 ...

  6. 【Python】:用python做下百度2014笔试题

    国庆节最后一天,明天就要上班了,闲来无事做做百度2014笔试题,好久没用过C++了,索性就用python简单的写一下,体验下题目难度.题目是从[大卫David]那里copy过来的. 1.给定任意一个正 ...

  7. 代写编程的作业、笔试题、课程设计,包括但不限于C/C++/Python

    代写编程作业/笔试题/课程设计,包括但不限于C/C++/Python 先写代码再给钱,不要任何定金!价钱公道,具体见图,诚信第一! (截止2016-11-22已接12单,顺利完成!后文有成功交付的聊天 ...

  8. C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解

    剑指offer  面试题23:从上往下打印二叉树 参与人数:4853  时间限制:1秒  空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...

  9. 经典笔试题:用C写一个函数测试当前机器大小端模式

    “用C语言写一个函数测试当前机器的大小端模式”是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 #include <stdio.h> union tes ...

随机推荐

  1. ehcache 缓存管理工具

    ehcache  ehcache.xml <ehcache>   <diskStore path="java.io.tmpdir" />   <def ...

  2. 【WPF/C#】拖拽Image图片控件

    需求:使得Image图片控件能够被拖动. 思路:关键是重写Image控件的几个鼠标事件,实现控制. 前台: <Image Source="C:\Users\Administrator\ ...

  3. 关于PDNN、Theano、Numpy以及Scipy的安装

    最近为了用下PDNN,先得安装这玩意,不装不知道,一装吓一跳,依赖关系也太多了吧,顿时有种贵圈真乱的感觉,如图1. 不过这B还得装下去. 图1 安装PDNN的依赖关系 之前也碰了好多问题,不过各种参考 ...

  4. Winform 加密连接字符串“未能提供RsaProtectedConfigurationProvider加密,对象已存在”的解决方案

    当一台机器已安装软件,并有新用户需要使用此软件时提示“未能提供RsaProtectedConfigurationProvider加密,对象已存在”. 这是因为加密模式是用户模式,需要运行以下脚本添加新 ...

  5. Remote Desktop Connection Manager远程管理工具

    下载地址:http://www.microsoft.com/en-us/download/details.aspx?id=44989

  6. win10设置删除文件提示框

    显示桌面,找到回收站   点击鼠标右键,点击“属性菜单”   勾选“显示删除对话框”   点击“应用”,点击“确定”.   测试一下吧,从电脑删除del删除一个文件.如下图所示,弹出了提示框.

  7. ubuntu 12.04 rails server 时候报错 execjs

    新的应用创建好了,使用rails server启动看看,oops!原来是没有javascript运行环境. 1 2 $ rails server  /usr/local/lib/ruby/gems/1 ...

  8. 运行带distance field的Hiero

    从http://libgdx.badlogicgames.com/releases/下载zip包并解压,切换到解压后的目录,执行: java -cp gdx.jar;gdx-natives.jar;g ...

  9. 上手并过渡到PHP7(3)——Uniform Variable Syntax到底统一了什么

    PHP7 up and running 泊学原文链接泊学实操视频 Uniform Variable Syntax 在PHP 7提出Uniform Variable Syntax之前,我们大多数人可能都 ...

  10. Qt学习之路(tip): parent参数

    这是一篇很简单的文章,仅仅是用来说明一下一个参数的作用,因此我把它写成了tip,而不是接下来的17.   程序写的多了,你会发现几乎所有的Qt类的构造函数都会有一个parent参数.这个参数通常是QO ...