1. 程式人生 > >演算法題,分享給需要的人

演算法題,分享給需要的人

1. 等差數列含有一序列的數項,所有後一項減去前一項的差值都想吐。例如,對於序列3,7,11,15;每一項減去前一項得到4。給定你一系列整數,我們要找到通過從給定系列整數       中選擇部分數字出來組成等差數列(可以交換數字順序,可以選取所有數字),並從中找到最長的等差數列。
    輸入:
            輸入一個整形陣列int[] values,表示整個序列的所有值。values 含有2到50個元素(其中包括2和50)
    輸出:
           返回最長的等差數列的長度
    舉例:

           values:{3,8,4,5,6,2,2},從這些數字中選取一些數字所組成的最長等差數列是2,3,4,5,6,所以返回5

    答案:

public static int longest(int[] values){
        if (values==null){
            return 0;
        }
        Arrays.sort(values);
        int maxlen=values[values.length-1]-values[0];
        int ans=1;
        if (maxlen==0){
            return values.length;
        }
       int[][] dp=new int[values.length][maxlen+1];
        for (int i = 0; i <dp.length ; i++) {
            for (int j = 0; j < maxlen+1; j++) {
                dp[i][j]=1;
            }
        }
        for (int i = 1; i <values.length ; i++) {
            for (int j = i-1; j >=0; j--) {
                int diff=values[i]-values[j];//算出i和j之間的等差
                dp[i][diff]=dp[j][diff]+1;//當前
                ans=Math.max(ans,dp[i][diff]);
            }
        }
        return ans;
    }

2.如果一個正整數不能被大於1的完全平方數所整除,那麼我們就將該數稱為無平方數因子的數。例如,靠前的一些無平方數因數的數是{1,2,3,5,6,7,10,11,13,14,15,17,19…}。    給出一個整數n,返回第n個無平方數因子的數。
   輸入:
          輸入一個整數n. n 的取值範圍為1到1,000,000(其中包括1和1,000,000)
   輸出:
         返回第n個無平方數因數的數
   舉例:
         n = 13, 返回19.

   答案:

public static int getNumber(int n) {
long result = -1;
int count = 0;
for (long i = 1; i <= Long.MAX_VALUE; i++) {
boolean found = false;
for (long j = 2; j <= i; j++) {
if (j * j > i) {
break;
}
if (i % j == 0 && i % (j * j) == 0) {
found = true;
break;
}
}
if (!found) {
count++;
if (count == n) {
result = i;
break;
}
}
}
return (int) result;
}

3.大雄把自己置身於一個無限大的二維平面中,然後假設,自己每次只能移動一步且不能向後移動,同時走過的格子立即塌陷,無法再走第二次。大雄想知道,如果走n步,有      多少個可能到達的終點。
   輸入:
         一個正整數n(0<n<=20),表示要走n步。
   輸出:
        走n步能到達的終點的數量。
   舉例:
        輸入1,輸出3。

   答案:

public static void numOfPath(int n) {
int[] a = new int[21];
int i;
a[0] = 1;
a[1] = 3;
for (i = 2; i <= 20; i++) {
a[i] = 2 * a[i - 1] + a[i - 2];


}
System.out.println(a[n]);
}