@Test public void test3t(){ test3( new int[]{1, 3, 2, 5, 3 }); test3( new int[]{3, 5, 2, 3, 1 }); test3( new int[]{1, 1, 3, 1}); test3( new int[]{1, 3, 1, 1 }); test3( new int[]{1,3,5,7,9}); test3( new int[]{1,1,3,1,5}); } public void test3(int[] intArray){ System.out.println(arrayToString( intArray )); int intOne = intArray[0]; int intTwo = intArray[1]; int intTree = intArray[2]; if( (intTwo - intOne) == (intTree - intTwo)){ if(intOne == intTwo && intTwo == intTree){ System.out.println("无解数据,改数据的基数和自增数都是2的次方") ; }else{ System.out.println("基数是 : " +( intArray[0] - intArray[1] <= 0 ?intArray[0] : intArray[intArray.length -1]) + arrayToString(intArray)) ; } return; } /** * 判断,判断是等差自增,等差自减。前提是定位好,头。。 * 那么需要判断这个这个数组的长度是奇数还是,偶数 */ int arrayLength = intArray.length; int jiOu = 1;// 1是偶数,, 0是奇数 if((arrayLength & 1) == 0 ){ arrayLength >>= 1; }else{ if( arrayLength != 1){ jiOu = 0; } } arrayLength = intArray.length; /** * 判断是等差自增,等差自减 * * 同时取到 判断 基数的2个数,如果是等差加,那么 就是从开始,如果是等差减,那么从尾端取 */ boolean b = true; int oneShu , twoShu = 0; if( intArray[0] >= intArray[arrayLength-1 -jiOu]){//得到的是第一个奇数 和最后一个奇数,如果第一个 大于最后一个那么 是等差减 oneShu = intArray[arrayLength -1]; twoShu = intArray[arrayLength -2]; }else{ oneShu = intArray[0]; twoShu = intArray[1]; b = false; } /** * 现在判断 基数 是偶数还是奇数 * 偶数会被2除尽,被出尽的数,小于 该偶数前一个奇数。 * 取出,前2个数,第一个数大于等于第二个,那么是基数为奇数,如果小于第二个数,那么是基数是偶数 * * 同时算出基数, * [2 ,5 ,8 ] [ 1,4 ,7] [8 , 5, 2] [ 7 ,4, 1] * [ 1, 5,1 ] [1, 1, 7] [1 , 5 , 1] [ 7 ,4, 1] * * * 1,只用在三个数,内算出奇数 * (1) 如果是基数是奇数 * 找到第二个奇数 - 第一个奇数 除以 2,就是基数, * (2) 如果是基数是偶数 * 偶数要被2除尽,第二个偶数,比第一个奇数大, 那么是这个奇数2陪的范围内 * 2,只用在死个数,内算出奇数 * 找到第二个奇数 - 第一个奇数 除以 2,就是基数, * * 3,最后研究发现,用第一个或第二个数就可以得到了。使用最后一种方式。 */ int dengCha = 0 , cha = 0; if(oneShu >= twoShu){//基数是奇数,换位是,用偶数的逻辑,算出基数 dengCha = oneShu; oneShu = twoShu; twoShu = oneShu; cha = 1; } while( oneShu < twoShu ){ oneShu <<=1;//经过计算后,twoShu就是基数了 } dengCha = twoShu - ( oneShu =oneShu >> 1) ; if(oneShu == 0){ oneShu = 1; } if(b){ for(int i = cha ; i< arrayLength ; i = i+2){ intArray[arrayLength -1-i] = dengCha*i+oneShu; } }else{ for(int i = cha ; i<arrayLength ; i = i+2){ intArray[i] = dengCha*i+oneShu; } } System.out.println(arrayToString( intArray )); }
最后完整的一套代码:第四点,没有做优化。。如有不足之处,尽情的飙。