在黑板上写下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. 快速排序——PowerShell版

    继续读啊哈磊算法有感系列,继续升华.上一篇是冒泡排序,在结尾总结了一下冒泡排序的缺点——时间复杂度O(N*N)太大.这一篇来说一下快速排序,快速排序可以在多数情况下克服冒泡排序的缺点(最坏的情况下和冒 ...

  2. malloc和free函数详解

    一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...

  3. c#的static什么时候使用

    C# 什么时候用static? 2011-10-14 14:37江户川奈叶 | 浏览 1733 次  Perl 在static void Main()的方法外面设一个 static int amoun ...

  4. DOS下运行C++程序配置

    闲来无事,想想C++是否一样能用dos来,编译运行程序呢,于是上网搜搜结果喜人,详见 http://blog.csdn.net/xiaoqinpeng/article/details/6556843 ...

  5. C语言实现单链表(不带头结点)节点的插入

    对单链表进行增删改查是最主要的操作.我在上一篇博客<C语言实现链表节点的删除>实现了删除单链表中的某个节点. 这里我们要来实如今某个位置插入节点.演示样例代码上传至https://gith ...

  6. AX88772B 驱动移植

    Linux kernel 3.2.0 捏自带的AX88772B 不稳定,现用 AX88772B 官方的驱动进行移植测试. 驱动下载地址: http://www.asix.com.tw/cs/produ ...

  7. JAVA里使用CKEditor和CKFinder的配置

    在JSP里使用CKEditor和CKFinder的配置 CKEditor的编辑器工具栏中有一项“图片域”,该工具可以贴上图片地址来在文本编辑器中加入图片,但是没有图片上传. “预览”中有一大堆鸟语,看 ...

  8. [转]eclipse导入V7包出现错误解决办法

    android下v4    v7   v21等包是android系统的扩展支持包,就想windows的系统补丁一个道理. android的扩展包主要是用来兼容低版本的,比如android3.0以后出现 ...

  9. SpringMVC拦截器简单使用

    一.拦截器的配置 1.传统的配置 Xml代码   <bean class="org.springframework.web.servlet.mvc.annotation.Default ...

  10. mac安装IDEA

    Mac上安装Java7 首先我们需要去oracle下载最新的jdk,笔者拿到的最新的版本是1.7.0_45-b18,这里没有什么好说的,直接下载安装即可,安装完毕后需要在.bash_profile或者 ...