`
MouseLearnJava
  • 浏览: 460291 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

面试题 -- 1到50个数,每次去掉两个数,增加两个数差的绝对值,最后剩什么数?为什么?

阅读更多
逛网页的时候,发现阿里巴巴2014校园招聘笔试最后一道题目
http://blog.csdn.net/qingsong3333/article/details/11910771

题目:在黑板上写下50个数字:1至50.在接下来的49轮操作中,每次做如下动作:选取两个黑板上的数字a和b,擦去,在黑板上写|b - a|。请问最后一次动作之后剩下数字可能是什么?为什么?

我的分析:由于擦除数字的随机性,最后一定不是某个具体的数字,唯独能确定的是奇数还是偶数。

我的答案:最后是个奇数,原因如下:

首先对可能擦除的种类进行分析,有三种可能:
1. 擦除两个奇数 Num1 和Num2, 擦除后新增一个偶数 Num3 = |Num1 - Num2|
在这种情况下 Num1 + Num2 - |Num1 - Num2| 是偶数,也就是说,这种情况下,黑板上现有数字的总和会减少一个偶数值( Num1 + Num2 - |Num1 - Num2| )

2. 擦除两个偶数Num1 和 Num2, 擦除后新增一个偶数Num3 = |Num1 -Num2|
在这种情况下 Num1 + Num2 - |Num1 - Num2| 是偶数,也就是说,这种情况下,黑板上现有数字的总和会减少一个偶数值( Num1 + Num2 - |Num1 - Num2| )

3. 擦除一个偶数(Num1)一个奇数(Num2), 擦除后新增一个奇数Num3 = |Num1 - num2|, 在这种情况下 Num1 + Num2 - |Num1 - Num2| 还是一个偶数,也就是说,这种情况下,黑板上现有数字的总和会减少一个偶数值( Num1 + Num2 - |Num1 - Num2| )

上述三种可能的情况可以看出,不管是哪一种情况,每次操作都将减少一个偶数差值。(Num1 + Num2 - |Num1 - Num2|)

这样,最后剩余的一个数是奇数还是偶数,我们只要看一下1到50的总和是奇数还是偶数即可。

1到50的和是1275,是一个奇数,这样我们便可以知道最后一个数一定是一个奇数,因为每次擦除操作减少的都是一个偶数差值(Num1 + Num2 - |Num1 - Num2|)。

下面用程序来运行一下,也能发现最后的数字是一个奇数。

程序如下:
package my.thread;

import java.util.LinkedList;
import java.util.List;
import java.util.Random;

/**
 * 
 * @author Eric
 * 
 */
public class AlibabaExample {

	public static void main(String[] args) {

		AlibabaExample example = new AlibabaExample();

		int lastIntValue = 0;
		for (int i = 0; i < 100; i++) {
			lastIntValue = example.populateLastRemainingNumber();
			System.out.println(String.format("第%d次运行,最后剩余的数是--> %d, 是个%s",
					i + 1, lastIntValue, lastIntValue % 2 == 0 ? "偶数" : "奇数"));
		}
	}

	public int populateLastRemainingNumber() {
		List<Integer> intList = initList();

		Random ran = new Random();
		int size = 0;

		int ranIndex1 = 0;
		int ranIndex2 = 0;

		int num1 = 0;
		int num2 = 0;

		for (int i = 0; i < 49; i++) {

			size = intList.size();

			ranIndex1 = ran.nextInt(size);

			while (true) {
				ranIndex2 = ran.nextInt(size);
				if (ranIndex1 != ranIndex2) {
					break;
				}
			}
			num1 = intList.get(ranIndex1);
			num2 = intList.get(ranIndex2);
			intList.remove(ranIndex1);

			if (ranIndex1 > ranIndex2) {
				intList.remove(ranIndex2);
			} else {
				intList.remove(ranIndex2 - 1);
			}

			intList.add(Math.abs(num1 - num2));
		}

		return intList.get(0);
	}

	private List<Integer> initList() {
		List<Integer> intList = new LinkedList<Integer>();

		for (int i = 1; i < 51; i++) {
			intList.add(i);
		}

		return intList;
	}
}


某次运行的结果:
第1次运行,最后剩余的数是--> 13, 是个奇数
第2次运行,最后剩余的数是--> 9, 是个奇数
第3次运行,最后剩余的数是--> 13, 是个奇数
第4次运行,最后剩余的数是--> 27, 是个奇数
第5次运行,最后剩余的数是--> 1, 是个奇数
第6次运行,最后剩余的数是--> 7, 是个奇数
第7次运行,最后剩余的数是--> 7, 是个奇数
第8次运行,最后剩余的数是--> 3, 是个奇数
第9次运行,最后剩余的数是--> 13, 是个奇数
第10次运行,最后剩余的数是--> 11, 是个奇数
第11次运行,最后剩余的数是--> 1, 是个奇数
第12次运行,最后剩余的数是--> 15, 是个奇数
第13次运行,最后剩余的数是--> 13, 是个奇数
第14次运行,最后剩余的数是--> 17, 是个奇数
第15次运行,最后剩余的数是--> 1, 是个奇数
第16次运行,最后剩余的数是--> 7, 是个奇数
第17次运行,最后剩余的数是--> 15, 是个奇数
第18次运行,最后剩余的数是--> 21, 是个奇数
第19次运行,最后剩余的数是--> 7, 是个奇数
第20次运行,最后剩余的数是--> 11, 是个奇数
第21次运行,最后剩余的数是--> 1, 是个奇数
第22次运行,最后剩余的数是--> 1, 是个奇数
第23次运行,最后剩余的数是--> 19, 是个奇数
第24次运行,最后剩余的数是--> 17, 是个奇数
第25次运行,最后剩余的数是--> 9, 是个奇数
第26次运行,最后剩余的数是--> 15, 是个奇数
第27次运行,最后剩余的数是--> 9, 是个奇数
第28次运行,最后剩余的数是--> 7, 是个奇数
第29次运行,最后剩余的数是--> 23, 是个奇数
第30次运行,最后剩余的数是--> 17, 是个奇数
第31次运行,最后剩余的数是--> 13, 是个奇数
第32次运行,最后剩余的数是--> 27, 是个奇数
第33次运行,最后剩余的数是--> 15, 是个奇数
第34次运行,最后剩余的数是--> 11, 是个奇数
第35次运行,最后剩余的数是--> 21, 是个奇数
第36次运行,最后剩余的数是--> 9, 是个奇数
第37次运行,最后剩余的数是--> 11, 是个奇数
第38次运行,最后剩余的数是--> 7, 是个奇数
第39次运行,最后剩余的数是--> 3, 是个奇数
第40次运行,最后剩余的数是--> 11, 是个奇数
第41次运行,最后剩余的数是--> 9, 是个奇数
第42次运行,最后剩余的数是--> 11, 是个奇数
第43次运行,最后剩余的数是--> 23, 是个奇数
第44次运行,最后剩余的数是--> 7, 是个奇数
第45次运行,最后剩余的数是--> 5, 是个奇数
第46次运行,最后剩余的数是--> 11, 是个奇数
第47次运行,最后剩余的数是--> 25, 是个奇数
第48次运行,最后剩余的数是--> 29, 是个奇数
第49次运行,最后剩余的数是--> 15, 是个奇数
第50次运行,最后剩余的数是--> 3, 是个奇数
第51次运行,最后剩余的数是--> 9, 是个奇数
第52次运行,最后剩余的数是--> 5, 是个奇数
第53次运行,最后剩余的数是--> 1, 是个奇数
第54次运行,最后剩余的数是--> 21, 是个奇数
第55次运行,最后剩余的数是--> 1, 是个奇数
第56次运行,最后剩余的数是--> 33, 是个奇数
第57次运行,最后剩余的数是--> 9, 是个奇数
第58次运行,最后剩余的数是--> 15, 是个奇数
第59次运行,最后剩余的数是--> 1, 是个奇数
第60次运行,最后剩余的数是--> 5, 是个奇数
第61次运行,最后剩余的数是--> 3, 是个奇数
第62次运行,最后剩余的数是--> 29, 是个奇数
第63次运行,最后剩余的数是--> 11, 是个奇数
第64次运行,最后剩余的数是--> 13, 是个奇数
第65次运行,最后剩余的数是--> 3, 是个奇数
第66次运行,最后剩余的数是--> 5, 是个奇数
第67次运行,最后剩余的数是--> 9, 是个奇数
第68次运行,最后剩余的数是--> 7, 是个奇数
第69次运行,最后剩余的数是--> 7, 是个奇数
第70次运行,最后剩余的数是--> 19, 是个奇数
第71次运行,最后剩余的数是--> 7, 是个奇数
第72次运行,最后剩余的数是--> 25, 是个奇数
第73次运行,最后剩余的数是--> 1, 是个奇数
第74次运行,最后剩余的数是--> 3, 是个奇数
第75次运行,最后剩余的数是--> 5, 是个奇数
第76次运行,最后剩余的数是--> 13, 是个奇数
第77次运行,最后剩余的数是--> 15, 是个奇数
第78次运行,最后剩余的数是--> 15, 是个奇数
第79次运行,最后剩余的数是--> 9, 是个奇数
第80次运行,最后剩余的数是--> 15, 是个奇数
第81次运行,最后剩余的数是--> 19, 是个奇数
第82次运行,最后剩余的数是--> 3, 是个奇数
第83次运行,最后剩余的数是--> 7, 是个奇数
第84次运行,最后剩余的数是--> 3, 是个奇数
第85次运行,最后剩余的数是--> 15, 是个奇数
第86次运行,最后剩余的数是--> 13, 是个奇数
第87次运行,最后剩余的数是--> 5, 是个奇数
第88次运行,最后剩余的数是--> 9, 是个奇数
第89次运行,最后剩余的数是--> 3, 是个奇数
第90次运行,最后剩余的数是--> 29, 是个奇数
第91次运行,最后剩余的数是--> 5, 是个奇数
第92次运行,最后剩余的数是--> 11, 是个奇数
第93次运行,最后剩余的数是--> 15, 是个奇数
第94次运行,最后剩余的数是--> 15, 是个奇数
第95次运行,最后剩余的数是--> 5, 是个奇数
第96次运行,最后剩余的数是--> 31, 是个奇数
第97次运行,最后剩余的数是--> 5, 是个奇数
第98次运行,最后剩余的数是--> 1, 是个奇数
第99次运行,最后剩余的数是--> 9, 是个奇数
第100次运行,最后剩余的数是--> 23, 是个奇数

转载请注明出处:http://mouselearnjava.iteye.com/blog/1949605
3
1
分享到:
评论
1 楼 jahu 2013-10-02  
主要是不明白这到题的意思。

相关推荐

    c++ 面试题 总结

    C++面试题 1.是不是一个父类写了一个virtual 函数,如果子类覆盖它的函数不加virtual ,也能实现多态? virtual修饰符会被隐形继承的。 private 也被集成,只事派生类没有访问权限而已 virtual可加可不加 子类的...

    JAVA面试题最全集

    如何取得从1970年到现在的毫秒数 如何获取某个日期是当月的最后一天 如何格式化日期 5.数组和集合 6.文件和目录(I/O)操作 如何列出某个目录下的所有文件 如何列出某个目录下的所有子目录 判断一个文件或...

    java面试题大全(2012版)

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    Java面试宝典-经典

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    Java面试代码与编程题

    Java面试代码与编程题 Java面试代码与编程题

    Java经典编程题(附答案)

    1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 【程序3】 题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和...

    【。net 专业】 面试题

    【面试题库网整理 .net 面试题(附答案)(四)】 7. 某一密码仅使用K、L、M、N、O共5个字母,密码中的单词从左向右排列,密码单词必须遵循如下规则: (1) 密码单词的最小长度是两个字母,可以相同,也可以不同 ...

    oracle面试题

    concat str str 连接两个字符串 LOWER 函数把字符串全部转换为小写 UPPER 函数把字符串全部转换为大写 LTRIM 函数把字符串头部的空格去掉 RTRIM 函数把字符串尾部的空格去掉 TRIM 同时去掉所有两端的空格 实际上...

    java 面试题 总结

    28、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 以下程序使用内部类实现线程,对j增减的时候没有考虑顺序问题。 public class ThreadTest1{ private int j; public static ...

    java面试宝典2012

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 40 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    Java面试宝典2010版

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 ...

    最新名企标准通用C++面试题,

    C++面试题 参考:http://blog.csdn.net/Ghost90/archive/2009/04/22/4099672.aspx 整理:松鼠 时间:2009-5-8 1、const 有什么用途?(请至少说明两种) 答: (1)可以定义 const 常量 (2)const可以修饰函数的...

    最新Java面试宝典pdf版

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    Java面试宝典2012新版

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    Java面试笔试资料大全

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    JAVA面试宝典2010

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

    超级有影响力霸气的Java面试题大全文档

    超级有影响力的Java面试题大全文档 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。...

    Java面试宝典2012版

    55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序...

Global site tag (gtag.js) - Google Analytics