锁定老帖子 主题:谷歌的一道面试题,请大家集思广益
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (2)
|
|
---|---|
作者 | 正文 |
发表时间:2011-06-02
看了上面许多牛人的想法,我也把自己的想法写一下
思考题目主要是找出差值 我的思路是从数组的最后面两个数判断 排除1,1,1,1 如果最后一个数(arr(n))大于前一个数(arr(n-1)) 那就把arr(n-1)左移,直到比arr(n)大的时候的前一位数就应该是他原来的值 用arr(n)-左移后的值就可以的到差值。然后替换数组。 如果最后一个数(arr(n))小于前一个数(arr(n-1)) 那循环左移,直到大于前一个数 Boolean flag = true int i = 1; while(flag){ arr(n)>>i++; if(arr(n)>arr(n-1)){ flag = flase } } 然后arr(n)-arr(n-1)得到差值就可以推算出前面的数值 这个是递增数组 递减数组的话就从第一位和第二位比较就可以了。 也不知道想法有没有漏洞,请高手指正 |
|
返回顶楼 | |
发表时间:2011-06-02
你当时说出递归两个字,这道题就算过了。
|
|
返回顶楼 | |
发表时间:2011-06-03
最后修改:2011-06-03
0、首项和公差不能都为偶数,否则失真。
1、前两项绝对值大的那个是原值 2、若第n项是原值,那么第n+2*i项必为原值。 |
|
返回顶楼 | |
发表时间:2011-06-03
最后修改:2011-06-03
if(i!=我){} 写道 0、首项和公差不能都为偶数,否则失真。
1、前两项绝对值大的那个是原值 2、若第n项是原值,那么第n+2*i项必为原值。 package com.cccode.dclist; public class dclist { /** * @author CC * @param args */ public static void main(String[] args) { /********************* 生成原数组 **************************************/ int arr[] = new int[20]; int min = -331; int d = 32; for (int i = 0; i < arr.length; i++) { arr[i] = min + d * i; } System.out.print("原数组: {"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + ", "); } System.out.println("}"); System.out.println("min = " + min + " d = " + d); /************************ 将原数组转化为求解数组 ***********************/ for (int i = 0; i < arr.length; i++) { while (arr[i] % 2 == 0) { arr[i] /= 2; } } System.out.print("求解数组: {"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + ", "); } System.out.println("}"); /*********************** 求出公差和最小值 ******************************/ int min1 = 0; int d1 = 0; if (Math.abs(arr[0]) >= Math.abs(arr[1])) { d1 = (arr[2] - arr[0]) / 2; min1 = arr[0]; } else { d1 = (arr[3] - arr[1]) / 2; min1 = arr[1] - d1; } System.out.println("min1 = " + min1 + " d1 = " + d1); } } 另外,数组长度须 >= 4 |
|
返回顶楼 | |
发表时间:2011-06-03
最后修改:2011-06-03
原数组: {31, 62, 93, 124, 155, 186, 217, 248, 279, 310, 341, 372, 403, 434, 465, 496, 527, 558, 589, 620, }
min = 31 d = 31 求解数组: {31, 31, 93, 31, 155, 93, 217, 31, 279, 155, 341, 93, 403, 217, 465, 31, 527, 279, 589, 155, } min1 = 31 d1 = 31 原数组: {32, 63, 94, 125, 156, 187, 218, 249, 280, 311, 342, 373, 404, 435, 466, 497, 528, 559, 590, 621, } min = 32 d = 31 求解数组: {1, 63, 47, 125, 39, 187, 109, 249, 35, 311, 171, 373, 101, 435, 233, 497, 33, 559, 295, 621, } min1 = 32 d1 = 31 原数组: {31, 63, 95, 127, 159, 191, 223, 255, 287, 319, 351, 383, 415, 447, 479, 511, 543, 575, 607, 639, } min = 31 d = 32 求解数组: {31, 63, 95, 127, 159, 191, 223, 255, 287, 319, 351, 383, 415, 447, 479, 511, 543, 575, 607, 639, } min1 = 31 d1 = 32 原数组: {32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608, 640, } min = 32 d = 32 求解数组: {1, 1, 3, 1, 5, 3, 7, 1, 9, 5, 11, 3, 13, 7, 15, 1, 17, 9, 19, 5, } min1 = 1 d1 = 1 原数组: {-331, -300, -269, -238, -207, -176, -145, -114, -83, -52, -21, 10, 41, 72, 103, 134, 165, 196, 227, 258, } min = -331 d = 31 求解数组: {-331, -75, -269, -119, -207, -11, -145, -57, -83, -13, -21, 5, 41, 9, 103, 67, 165, 49, 227, 129, } min1 = -331 d1 = 31 原数组: {-331, -299, -267, -235, -203, -171, -139, -107, -75, -43, -11, 21, 53, 85, 117, 149, 181, 213, 245, 277, } min = -331 d = 32 求解数组: {-331, -299, -267, -235, -203, -171, -139, -107, -75, -43, -11, 21, 53, 85, 117, 149, 181, 213, 245, 277, } min1 = -331 d1 = 32 |
|
返回顶楼 | |
发表时间:2011-06-06
thihy 的答案思路不错,我想这这个题目要分情况,体现一个人分析问题的能力。受教了
|
|
返回顶楼 | |
发表时间:2011-06-07
设a为数列第一个元素,d为公差。
1. 如果d为偶数,a为偶数,等差数列全是偶数,按照上面的计算,等到的结果可能有两种:一种是仍然是等差数列(如果d/2仍然为偶数的话),另一种奇数项仍成等差数列 2. 如果d为偶数,a为奇数,等差数列全是奇数,变换后的等差数列不变 3. 如果d为奇数,a为偶数,等差数列呈 偶奇偶奇...状,变换后偶数项仍成等差数列 4. 如果d为奇数,a为奇数,等着数列呈 奇偶奇偶...状,变换成奇数项仍成等差数列 由此可见,变换的的数列只有三种情况 (1)全是奇数项的等差数列(原始数列可能是1,2两种情况) (2)奇数项仍成等差数列的数列(原始数列可能是1,4两种情况) (3)偶数项仍成等差数列的数列(原始数列是3的情况) 所以,单凭变换后的数列不一定能还原原始数列,但是有办法重新得到一个等差数列。 |
|
返回顶楼 | |
发表时间:2011-06-09
最后修改:2011-06-09
首先 等差数列的 公式 Xn=a+Y*(n-1); (a为基础值,n为数组序号,y为差量,x为数组值)
得到数组 {a,a+y,a+2y,a+3y,a+4y,...} 通过规则可以得出a,y的奇偶性直接影响结果。 对于结果数组至少要4个以上,3个一下部分规则不使用 需要调整 x1,x2,x3,x4 1.(x1=x2=x3=x4){ x1倍数 } 2.if y=(x3-x1)/2 作为差值 验证 x2×2^N=x1+y,x4×2^N=x3+y 3.if y=(x4-x2)/2 作为差值 验证 x1×2^N=x2-y,x3×2^N=x4-y 最终可以得到数组的最小组合 |
|
返回顶楼 | |
发表时间:2011-06-10
lisgking
说得不错。从后向前的比较。因为是等差序列。只能求处最小原始序列、结果不为一。 public class Test { public static int[] getHY(int[] result){ int[] ret = null; if(result == null){ return null; } if(result.length <=2){ return result; } ret = result; for(int i=result.length-1; i>0; i--){ for(int j=0; j<i; j++){ if(ret[i] <= ret[j]){ ret[i] = ret [i]<<1; } } } return ret; } public static void main(String[] args) { int [] t = new int[]{1,1,3,1}; int [] r = Test.getHY(t); for(int i=0; i<r.length; i++){ System.out.println(r[i]); } } } |
|
返回顶楼 | |
发表时间:2011-06-13
最后修改:2011-06-13
public class test{ public static void main(String[] args){ int[] a = {-331, -299, -267, -235, -203, -171, -139, -107, -75, -43, -11, 21, 53, 85, 117, 149, 181, 213, 245, 277}; int d = (a[2] - a[0])/2; for(int i = 0;i < a.length - 1; i++){ if((a[i+1] - a[i] != d)){ int x = a[i + 1] * 2; int y = a[i]; if(x - y != d){ while((x - y != d)){ x *= 2; } } a[i + 1] = x; } } for(int i = 0;i < a.length; i++){ System.out.println(a[i]); } } } 代码只是体现一下思路,多多指教~ |
|
返回顶楼 | |