在黑板上写下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. SharePoint自动化系列——Set MMS field value using PowerShell.

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ 本章将总结一下设置SharePoint list中item的Managed Metadata fi ...

  2. poj 50道dp题

    1.poj  3267 题意:给你一个字符串,下面有若干单词,问字符串要变成由下面单词组成的字符串,至少要删除多少个字母...... 例如: 6 10 browndcodw cow milk whit ...

  3. wampserver 报错 Fatal error:Call to undefined function curl_init()

    解决办法如下: 左键wampserver软件,找到PHP,然后找到扩展,点击php_curl开启这个扩展. 然后找到PHP的配置文件php.ini,路径为D:\wamp\bin\php\php5.3. ...

  4. idea中maven依赖不能下载的解决办法

    使用maven 命令 maven install 在项目所在文件夹 执行.

  5. 【Unity/Kinect】使用KinectManager的一般流程

    想要从Kinect读取到数据,然后使用数据,通常是以下流程: using UnityEngine; using System.Collections; /// <summary> /// ...

  6. [小技巧]Linux的一些信息获取

    1. Linux 系统登录之后,显示如下 Last login: Thu Jan :: UTC on ttyS0 Linux xxx # PREEMPT Wed Jul :: CST armv7l 那 ...

  7. java资料——顺序存储结构和链式存储结构(转)

    顺序存储结构 主要优点 节省存储空间,随机存取表中元素 缺    点 插入和删除操作需要移动元素 在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素,称作线性表的顺序存储结构. 顺序存储结 ...

  8. Web API(三):创建Web API项目

    在本篇文章中将讲解如何使用Visual Studio创建一个新的ASP.NET Web API项目. 在Visual Studio中有两种方式用于创建Web API项目: 1.创建带MVC的Web A ...

  9. java- 控制double输出的小数点位数

    像C语言直接  printf("%f.02",float); 非常简单,还可以控制输出的缩距,很是方便. Java就不一样了,但是java也有它的方便之处 下面用列子来解释,用到的 ...

  10. html中的label配合checkbox,redio用法

    <input id="a1" type="checkbox" name="a" value="33023" /&g ...