您的位置:首页 > 其它

2013阿里巴巴笔试题选解

2013-10-14 20:19 190 查看
首先题目如下:

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

一开始暂时没解题的思路,于是简单写了段程序测试一下:

public class RemovingInteger
{
public static int ARRAY_SIZE = 9;

public static void main(String args[])
{
for (int j = 0; j < 10; j++)
{
ArrayList<Integer> integers = new ArrayList<Integer>();
for (int i = 1; i <= ARRAY_SIZE; i++)
{
integers.add(i);
}

Random random = new Random();
for (int i = 0; i < ARRAY_SIZE - 1; i++)
{
int index1 = random.nextInt(integers.size());
int index2;
do
{
index2 = random.nextInt(integers.size());
}
while (index1 == index2);
int abs = Math.abs(integers.get(index1) - integers.get(index2));
integers.remove(index1);
if (index1 > index2)
{
integers.remove(index2);
} else
{
integers.remove(index2 - 1);
}
integers.add(abs);
}
for (Integer integer : integers)
{
System.out.println("last integer: " + integer);
}
}
}
}


运行结果如下:

last integer: 13

last integer: 1

last integer: 15

last integer: 7

last integer: 13

last integer: 27

last integer: 39

last integer: 11

last integer: 9

last integer: 1

        显然上面的结果均为奇数。于是便可以想到题目中最后剩下的数字应该是一个奇数,于是可以从数字的奇偶性思考。1到50个数字操作的结果为奇数的理由很容易想到:假设有1到n个数进行题目中提到的操作,那么每一次取a、b两个数字进行|a-b|,那么最终的结果可能是减少两个奇数,增加一个偶数;减少两个偶数再增加一个偶数;或者减少一奇一偶,增加一个奇数。因此奇数只能两个两个减少、或者不减少。那么由于1到50个数字中总共存在25个奇数,因此最终的剩下的一个数字必然是奇数。接下来就是是关于这个奇数的取值范围的问题。当然显然最终的结果在0到50之间。那么问题就只剩下是否0到50之中的奇数是否都能到的问题。

        如果我们将数字减少到1、2、3三个数字,那么按照题目中的操作,最后剩下的数字就是0、2两个。如果再增加一个数字到4,首先4-2、4-0,即最终结果2、4是可以得到的;又因为在n为4的倍数,即有偶数个奇数的情况下,将这些数字安装1和2、3和4...分组求绝对值,最终结果可以得到偶数个1,两两求绝对值,就可以得到0的结果。然后将数字增加到5,那么最终的结果就是5-0、5-2、5-4,即1、3、5。

       因此可以做进一步的推论,对于任意1到n个数字做题目中的操作,最终的结果如下:

      n=4m,m为正整数(下面m同样为正整数)。此时1到n就有偶数个奇数,那么最终操作的结果为0、2、4....n
      n=4m + 1,那么此时奇数的个数比4m增加了一个,则共存在奇数个奇数。最终的结果为1、3、5...n。
      n=4m + 2,那么奇数的个数仍然为奇数;最终的结果还是1、3、5...n-1。
      n=4m + 3。此时奇数的个数就为偶数个。最终的结果为0、2、4...n - 1。
       按题目中1到50操作,最终得到的结果为1、3、5...49中间这些所有的奇数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: