传说是一道腾讯的面试题
题目如下:
根据上排给出十个数,在其下排填出对应的十个数
要求下排每个数都是先前上排那十个数在下排出现的次数。
上排的十个数如下:
【0,1,2,3,4,5,6,7,8,9】
没错,题目就是只有这么一点。思考过程:
第一排的数字: 0 1 2 3 4 5 6 7 8 9
如果下一排全是0的话,那么,0下面(即指第二排,之后类似)就应该是10,这样,0下的的数字就应该是9,那么9下面就应该是1,那么1下面就应该是1,那么0下面就成了7,这样9下面的1就不应该存在了,反而7下面是1,这样1下面是1,7下面也是1,这样1下面就应该是2,不过这个又带来一个问题就是,1下面是2就是错的了,这样就没有办法收敛了,所以呢,如果2下面是1的话,那么1下面是2,就这么成立了。所以呢,最后的结果就是,0下面是6,1下面2,2下面1,6下面1,其余都是0,也就是:
第一行 0 1 2 3 4 5 6 7 8 9
第二行 6 2 1 0 0 0 1 0 0 0
这样就满足了题目中的要求: 下排每个数都是先前上排那十个数在下排出现的次数。
不过这东西还有一些数学上的分析,同样转自: http://blog.csdn.net/wcyoot/article/details/6428305
1)下排n个数的累加和为n,即b[0]+b[1]+...+b[n-1] = n
总共有n个数字,下一排的每个数字为在下一排出现的次数,如果能够构造成功,肯定是要出现n次,简单的说,0出现6次,也就是下一排中有6个位置被0占据,下一排总共有n个位置,所以你能够占据的位置和也就是n。
2)ai*bi的累加和也为n,即a[0]*b[0]+a[1]*b[1]+...+a[n-1]*b[n-1] = n
这个理解起来比较别扭,可以这么理解,比如6和下面的1,就是,下面的位置中,有一个数字为6,0和下面的6就说明,下面的数字中有六个数字为0,同理可以理解其他的,这样 希格玛(a[i]*b[i]) 之后的结果就是一下排数字的和,也就是下一排数字的和,也就是n
3)对于b中任意一个元素b[j], 都存在i,a[i] = b[j].
4)对于b中任意一个元素b[j],都有b[j] >= 0
5)如果a中存在负数。其在b中出现的次数一定为0. 如果a中数值大于n,则其出现次数也为0.
6)a中至少有两个非0数值在b中出现的次数非0
a:由1)n > n*b[i],其中b[i]为最小值,则a b中一定均有数值0,否则无解。设a[0] = 0,b[0]为a[0]在b中出现次数。
b:由于b中一定存在0,则0的出现次数一定大于0,因此b[0]>0 且b[0] < n,b[1...n-1]中至少一个值为0. 非0元素出现的次数一共是n-b[0].
c:有2)和6)对任意a[i],a[i]*b[i] < n,即b[i] < n/a[i],对所有a[i]>=n/2的元素中,在b中出现的次数必须最多只有1个出现次数不为0,且为1.其余出现次数均为0,即[1, n/2)范围内最多只有n/2-1个元素,故0出现的次数必不小于n/2, [n/2,n)范围内的元素必有一个出现次数为1。因此a数列中也必须有1,否则无解。
d:有c得在数值范围为(0,n/2)中(假设有x这样的数)出现的次数和s为n - b[0]或n-b[0]-1。其中1出现的次数至少为1(由c得)。又如果1出现的次数为1,则1出现的次数已经为2,故1出现的次数必大于1.设为x, 则x出现的次数至少为1,而x>1,如果x出现的次数大于1,那么必须要有其他数出现的次数为x,这样无法收敛。故x出现的次数只能为1,1出现的 次数只能为2.