锁定老帖子 主题:谷歌的一道面试题,请大家集思广益
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (2)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-27
public class Ia_3{ public static void main(String args[]) throws Exception{ int length = args.length; int[] array = new int[length]; int i = 0; for(String s:args){ array[i] = Integer.parseInt(s); i++; } int n = 0; int [] brray = new int[length-1]; for(int count = 0;count<length-1;count++){ while(array[count+1]<=array[count]){ array[count+1] =2*array[count+1]; } brray[count] = array[count+1]-array[count]; n +=brray[count]; } int d = 1; for(int count = 0;count<length-1;count++){ int de = brray[count]; if(d == 1){ d = de; } else if((d!=1)&&(n%de==0)){ d = de; } } for(int j=1;j<length;j++){ array[j] = array[0]+j*d; } for(int a:array){ System.out.print(a+" "); } } }这是我写的无注释版本。。。借用了一个中间所数组计算公差。 |
|
返回顶楼 | |
发表时间:2011-05-29
在求那个数组时,记住被除了几次2,给标记一下。
|
|
返回顶楼 | |
发表时间:2011-05-29
我提供一个答案,因为奇数的二进制最后一位为1,而偶数最后一位为0.所以在把偶数变为奇数的时候其实就是把最后的0全部去掉,也就是一直向右位移,直到最后一位为1.反过来想推出原来的数据就可以判断下个数如果比上一个数小,就在它的最后面补0,直到比前一位的大为止,这样就可以了,不过在在后面加0的时候也需要考虑等差的大小。
|
|
返回顶楼 | |
发表时间:2011-05-29
最后修改:2011-05-30
补充一点,在第一遍加0的时候,可以对数列中的奇数做个标记,等遍历完了以后再做第二遍等差的检查,以数列中的奇数做为参考,对偶数加0不够的可以再补0,满足等差为止。
不过也可以在第一遍加0完了以后对数列的最后一个数减去第一个数,然后除以总的个数,看是否满足等差数列,不满意可以对最后一个数继续补0,以满足等差数列为止,然后在重新遍历一遍数列,进行满足等差的调整。 |
|
返回顶楼 | |
发表时间:2011-05-29
niveko 写道 我提供一个答案,因为奇数的二进制最后一位为1,而偶数最后一位为0.所以在把偶数变为奇数的时候其实就是把最后的0全部去掉,也就是一直向右位移,直到最后一位为1.反过来想推出原来的数据就可以判断下个数如果比上一个数小,就在它的最后面补0,直到比前一位的大为止,这样就可以了,不过在在后面加0的时候也需要考虑等差的大小。
这都被你想到了 |
|
返回顶楼 | |
发表时间:2011-05-30
我数学不大好,我感觉这道应该是考二进制的。
一个数/2就相当于左移或右移一位(我不记得是左移还是右移了)。 现在咱们可以把这个数变成二进制,可能可以根据正则表达式去计算这个数是奇数还是偶数,如果是偶数,再去掉一位再进行正则表达式运算。如果有可能,可以直接根据二进制进行正则表达式运算得到该值的奇数。 数据恢复,因为是等差数组,可能可以方差(还是什么差了)进行恢复,当然了,咱们需要知道其中的一数的原始值。 这只是个思路,本人也找不到具体解 |
|
返回顶楼 | |
发表时间:2011-05-30
to:wmcoo
哈哈,咱们想到一块去了,不过您比我先找到方法,恭喜您! |
|
返回顶楼 | |
发表时间:2011-05-30
OpenMind 写道 这个题很容易,等差数列就两个变量,首项和公差...加上“使公差最小”这个条件可以得到唯一解。根据给的数组,按照首项公差的奇偶性分4种情况分析、验证、排除可得解。
对于递减的数列,公差应该为负数,加上“公差最小”这个条件还不充分吧 |
|
返回顶楼 | |
发表时间:2011-05-31
这个应该是可以的,即时存在有多个答案的情况。
假如原始数组abcd...经过变换,变成了ABCD...。那么给出的ABCD...中,先找出最大的那个数,假如B最大,那么b=B。知道了B后,再根据A*2n,C*2n只要能凑成等差数列,ac就推出来了,随之整个数列就出来了。 abcd...知道后,abcd...的2n倍都是答案。 这样正确么? |
|
返回顶楼 | |
发表时间:2011-05-31
最后修改:2011-05-31
移位算法,对每个数化为二进制,右移位去掉后面的0,就是变换后的数。
反过来根据等差,左移得到。 |
|
返回顶楼 | |