论坛首页 综合技术论坛

谷歌的一道面试题,请大家集思广益

浏览 38419 次
精华帖 (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+" ");
		}
	}
}
 这是我写的无注释版本。。。借用了一个中间所数组计算公差。
0 请登录后投票
   发表时间:2011-05-29  
在求那个数组时,记住被除了几次2,给标记一下。
0 请登录后投票
   发表时间:2011-05-29  
我提供一个答案,因为奇数的二进制最后一位为1,而偶数最后一位为0.所以在把偶数变为奇数的时候其实就是把最后的0全部去掉,也就是一直向右位移,直到最后一位为1.反过来想推出原来的数据就可以判断下个数如果比上一个数小,就在它的最后面补0,直到比前一位的大为止,这样就可以了,不过在在后面加0的时候也需要考虑等差的大小。
0 请登录后投票
   发表时间:2011-05-29   最后修改:2011-05-30
补充一点,在第一遍加0的时候,可以对数列中的奇数做个标记,等遍历完了以后再做第二遍等差的检查,以数列中的奇数做为参考,对偶数加0不够的可以再补0,满足等差为止。

不过也可以在第一遍加0完了以后对数列的最后一个数减去第一个数,然后除以总的个数,看是否满足等差数列,不满意可以对最后一个数继续补0,以满足等差数列为止,然后在重新遍历一遍数列,进行满足等差的调整。
0 请登录后投票
   发表时间:2011-05-29  
niveko 写道
我提供一个答案,因为奇数的二进制最后一位为1,而偶数最后一位为0.所以在把偶数变为奇数的时候其实就是把最后的0全部去掉,也就是一直向右位移,直到最后一位为1.反过来想推出原来的数据就可以判断下个数如果比上一个数小,就在它的最后面补0,直到比前一位的大为止,这样就可以了,不过在在后面加0的时候也需要考虑等差的大小。

这都被你想到了
0 请登录后投票
   发表时间:2011-05-30  
我数学不大好,我感觉这道应该是考二进制的。
一个数/2就相当于左移或右移一位(我不记得是左移还是右移了)。

现在咱们可以把这个数变成二进制,可能可以根据正则表达式去计算这个数是奇数还是偶数,如果是偶数,再去掉一位再进行正则表达式运算。如果有可能,可以直接根据二进制进行正则表达式运算得到该值的奇数。

数据恢复,因为是等差数组,可能可以方差(还是什么差了)进行恢复,当然了,咱们需要知道其中的一数的原始值。

这只是个思路,本人也找不到具体解
0 请登录后投票
   发表时间:2011-05-30  
to:wmcoo
哈哈,咱们想到一块去了,不过您比我先找到方法,恭喜您!
0 请登录后投票
   发表时间:2011-05-30  
OpenMind 写道
这个题很容易,等差数列就两个变量,首项和公差...加上“使公差最小”这个条件可以得到唯一解。根据给的数组,按照首项公差的奇偶性分4种情况分析、验证、排除可得解。



对于递减的数列,公差应该为负数,加上“公差最小”这个条件还不充分吧
0 请登录后投票
   发表时间:2011-05-31  
这个应该是可以的,即时存在有多个答案的情况。
假如原始数组abcd...经过变换,变成了ABCD...。那么给出的ABCD...中,先找出最大的那个数,假如B最大,那么b=B。知道了B后,再根据A*2n,C*2n只要能凑成等差数列,ac就推出来了,随之整个数列就出来了。
abcd...知道后,abcd...的2n倍都是答案。
这样正确么?
0 请登录后投票
   发表时间:2011-05-31   最后修改:2011-05-31
    移位算法,对每个数化为二进制,右移位去掉后面的0,就是变换后的数。
反过来根据等差,左移得到。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics