`
MouseLearnJava
  • 浏览: 467125 次
  • 性别: 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  
主要是不明白这到题的意思。

相关推荐

    java面试题-经典选择题部分

    - **答案**: A、两个或两个以上的函数取相同的函数名,但形参的个数或类型不同 **解析**: - 函数重载允许在同一个类中定义多个同名方法,但这些方法的参数列表必须有所不同。 ### 16、异常处理 **题目**: 在异常...

    数据分析面试题-python笔面试题汇总2.docx

    【Python数据分析面试题汇总】 1. **Python求和**:Python内置函数`sum()`可用于求和,例如`sum(range(1, 101))`将计算从1到100的所有数字的总和。 2. **全局变量修改**:在函数内部修改全局变量需使用`global`...

    java面试题-50道最容易考的java题

    ng new) 用新字符串替换旧字符串 split(String regex) 使用正则表达式分割字符串 trim() 去掉字符串两端的空白符 Java 面试题涵盖了诸多核心概念,包括但不限于: 1. **JDK 与 JRE**:JDK 是 Java 开发工具包,...

    华为的一道面试题,两个长数字相乘

    根据给定的信息,我们可以深入探讨这道华为面试题——“两个长数字相乘”的实现细节与背后的算法原理。 ### 题目解析 题目要求计算两个长整数相乘的结果,这里的“长整数”指的是那些无法直接用现有的数据类型(如...

    前端大厂最新面试题-algorithm.docx

    前端大厂最新面试题-algorithm.docx 本文档涵盖了前端工程师面试中涉及到的算法问题,共90个题目,涵盖了字符串、数组、链表、栈、队列、树、排序、搜索、加密等多方面的知识点。 字符串部分 1. 封装一个函数,能...

    前端大厂最新面试题-reverseString.docx

    本文将深入探讨一个常见的面试题:字符串反转。题目中给出的代码实现了一个递归方法`reverseString`来完成这一任务。下面我们将详细解析这个函数以及相关知识点。 首先,让我们分析`reverseString`函数的工作原理:...

    MySql面试题.doc

    【MySQL面试题解析】 MySQL是世界上最流行的关系型数据库管理系统之一,尤其在Web开发领域中广泛应用。以下是一些MySQL面试中的常见问题及其详细解答: 1. 数据库是什么? 数据库是一个用于存储和管理数据的系统...

    java工程师面试题大全-100%公司笔试题你都能碰到几个

    ### Java工程师面试题知识点解析 #### 一、Hibernate中离线查询去除重复项 - **问题**: Hibernate中如何在离线查询中去除重复项? - **解决方案**: 在Hibernate的Criteria API中,可以通过调用`...

    前端大厂最新面试题-css.docx

    前端大厂最新面试题-css CSS是前端开发的基础,以下是对前端大厂最新面试题-css的总结和解释。 1. 控制元素的盒模型的属性是box-sizing。 2. 相邻选择器是+,能匹配相邻的兄弟元素。 3. 不能被子元素继承的属性...

    数据库常见面试题

    ### 数据库常见面试题解析 #### 1、数据库有哪几种范式? 数据库设计中遵循的规范称为“范式”,目前主要有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、BCNF(Boyce-Codd范式)、第四范式(4NF...

    oracle部分面试题-DBA数据库管理员JAVA程序员架构师必看 (2).pdf

    在第三道面试题中,一个子查询使用了 `union all` 来合并两个表中的商品ID,然后计算每个ID在两个表中出现的次数。 3. **聚合函数** - `count()`, `sum()` 等聚合函数在统计和分析数据时非常有用。第二道面试题中...

    星辰里的月光Java面试题-最新整理.docx

    《星辰里的月光Java面试题-最新整理》 在Java面试中,掌握核心知识点是至关重要的。这份文档整理了一些常见的Java面试题,涵盖了JavaSE的基础编程、面向对象特性、注释定义、关键字用法以及一些类和方法的理解。...

    50个C、C++面试题.50个智力测试题

    ### 50个C、C++面试题及50个智力测试题——经典智力测试题解析 #### 面试题1:斯密斯夫妇握手问题 **题目背景**: 斯密斯夫妇邀请了另外四对夫妇共进晚餐。在聚会过程中,每个人都遵循了一些规则:不与自己或配偶...

    oracle部分面试题-DBA数据库管理员JAVA程序员架构师必看 (3).pdf

    在面试题三中,`INTERSECT`用于找到商品A和B在两个表中都存在的ID。 4. **聚合函数与分组**: - `COUNT()`, `SUM()`, `GROUP BY`等用于统计和分组数据。面试题三中,使用`COUNT()`统计每个文化程度和年龄的人数,`...

    面试好题,程序题

    6. **最大公约数和最小公倍数**:使用辗转相除法(欧几里得算法)可以求得两个数的最大公约数,最小公倍数可以通过两数相乘除以最大公约数得到。 7. **字符统计**:通过while循环,逐个读取字符,用条件判断统计...

    JAVA经典算法面试39题及答案

    用这个数依次去除2到sqrt(这个数),如果期间没有能被整除的数,则这个数为素数。 - 由于我们只需要判断101到200之间的素数,所以循环的范围非常有限,可直接遍历此范围内的每个数,用试除法进行判断。 #### 程序3:...

Global site tag (gtag.js) - Google Analytics