[笔试题]黑板上写下50个数字,选两个黑板上数字a和b,在黑板写|b-a|,剩下的数字?
在黑板上写下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|,剩下的数字?的更多相关文章
- 剑指Offer面试题:21.从上到下打印二叉树
一.题目:从上到下打印二叉树 题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印.例如输入下图中的二叉树,则依次打印出8.6.10.5.7.9.11. 二叉树节点的定义如下,采用 ...
- 【剑指Offer学习】【面试题23:从上往下打印二叉树】
题目:从上往下打印出二叉树的每一个结点,同一层的结点依照从左向右的顺序打印. 二叉树结点的定义: public static class BinaryTreeNode { int value; Bin ...
- 《剑指offer》从上往下打印二叉树
本题来自<剑指offer> 从上往下打印二叉树 题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 队列的思想. 先将根节点加入,当取该节点时候,依次将左右子树加入,直 ...
- 《剑指offer》— JavaScript(22)从上往下打印二叉树
从上往下打印二叉树 题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路 借助两个辅助队列,一个用来存放结点,一个用来存放结点值: 先将根节点加入到队列中,然后遍历队列中的元素,遍历 ...
- 去蓝港在线面试Unity3D的笔试题。难吗?知道答案的在评论里写出来分享
前一阵子去蓝港面试unity3d程序,在前台登记以后被领到一个吧台前面填2张个人信息表,之后有人送来笔试题,做了1个小时,感觉挺难的.之后被带到下面面试,面试的是一个年龄稍大的(可能是项目经理或者技术 ...
- 【Python】:用python做下百度2014笔试题
国庆节最后一天,明天就要上班了,闲来无事做做百度2014笔试题,好久没用过C++了,索性就用python简单的写一下,体验下题目难度.题目是从[大卫David]那里copy过来的. 1.给定任意一个正 ...
- 代写编程的作业、笔试题、课程设计,包括但不限于C/C++/Python
代写编程作业/笔试题/课程设计,包括但不限于C/C++/Python 先写代码再给钱,不要任何定金!价钱公道,具体见图,诚信第一! (截止2016-11-22已接12单,顺利完成!后文有成功交付的聊天 ...
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
- 经典笔试题:用C写一个函数测试当前机器大小端模式
“用C语言写一个函数测试当前机器的大小端模式”是一个经典的笔试题,如下使用两种方式进行解答: 1. 用union来测试机器的大小端 #include <stdio.h> union tes ...
随机推荐
- Gson json解析工具
json 解析工具 ,谷歌出品 对象转换字符串 HashMap<String,String> hashMap = new HashMap<String, String>(); ...
- poj2018(高精度二分+dp)
题意:给你n个数,要你在这n个数里面找到一些连续的数,这些数的数量大于等于m,并且他们的平均值在这n个数里面是最大的....... 思路:先把n个数的最大最小值确定,然后二分枚举平均值,对于每一个连续 ...
- openldap 备份与导入 及相关问题
摘要: 对openldap进行备份时,直接使用slapcat命令进行备份,使用ldapadd还原出现问题及解决. 介绍: 对openldap进行备份时,直接使用slapcat命令进行备份(如代码一), ...
- js弹出window.open窗口
<html> <head> <SCRIPT LANGUAGE="JavaScript"> function openwin() {OpenWin ...
- 【C#/WPF】图片的切割/切图/裁剪图片
前台准备两个Image控件.上面是显示原图,下面显示切割后的效果. <StackPanel Orientation="Vertical"> <Image Widt ...
- 【WPF】样式与模板:鼠标移入/悬浮时按钮的背景色不改变
情况:鼠标移到按钮上,默认情况是按钮背景色会改变的,网上也能搜到很多如何自定义改变的背景色. 需求:现在需求反过来,想要鼠标移到按钮上,保持按钮的背景色不改变. 一种思路:在样式文件中,使用Multi ...
- CenOS6.5下源码安装vim-7.4
1.[下载] vim-7.4下载地址: ftp://ftp.vim.org/pub/vim/unix/vim-7.4.tar.bz2 2.[解压] tar jxvf vim-7.4.tar.bz2 之 ...
- Spring事务处理时自我调用的解决方案 嵌套AOP
开涛的解决方案1 http://jinnianshilongnian.iteye.com/blog/1487235 AopContext.currentProxy() 原理 http://books. ...
- ThinkPHP3.2 分组分模块
ThinkPHP/Conf/convention.php 'CONTROLLER_LEVEL' => 1, 修改成 'CONTROLLER_LEVEL' => 2,
- 关于Cocos2d-x的动作和动画
1.动作,在cocos2d-x中有非常多种的动作,各种移动,旋转,缩放,淡入淡出....等等非常多,但是这些动作只是作用于节点,最常作用于的就是精灵节点.而且我们可以把很多个动作放进一个Sequenc ...