java演算法題

abcjob發表於2021-09-09

         LZ最近翻了翻JAVA版的資料結構與演算法,無聊之下將書中的課後題一一給做了一遍,在此給出書中課後題的答案(非標準答案,是LZ的答案,猿友們可以貢獻出自己更快的演算法)。

 

1、編寫一個程式解決選擇問題。令k=N/2,畫出表格顯示程式對於N種不同的值的執行時間。

 

         分析:選擇問題是指從N個數當中,按升序(降序也可以)排列,找出第k個數。LZ的寫法是採用書中給出的演算法自己實現的,分別採用氣泡排序和分批處理的方式。以下為LZ寫出的演算法程式碼。

import java.util.Arrays;import java.util.Random;//選擇問題答案public class Select {    
   public static final Random RANDOM = new Random(47);    
   //假設N = 10
   public static void main(String[] args) {        for (int i = 0; i            printResult(createArray(RANDOM.nextInt(100000)));
       }
   }    
   //氣泡排序
   public static void sort(int[] values){        for (int i = 1; i values[j + 1]) {                    int temp = values[j];
                   values[j] = values[j + 1];
                   values[j + 1] = temp;
               }
           }
       }
   }    //分批處理
   public static int select(int[] values){        if (values == null || values.length == 0) {            throw new NullPointerException("values can't be null.");
       }        int k = values.length / 2;        int[] temp = Arrays.copyOf(values, k);
       sort(temp);        for (int i = k ; i                temp[k - 1] = temp[k - 2];                for (int j = k - 2; j >0; j--) {                    if (values[i] > temp[j]) {
                       temp[j + 1] = values[i];                        break;
                   }else {
                       temp[j] = temp[j - 1];
                   }
               }
           }
       }        return temp[k - 1];
   }    //建立隨即陣列
   public static int[] createArray(int length){        int[] values = new int[length];        for (int i = 0; i            values[i] = RANDOM.nextInt(length * 2);
       }        return values;
   }    //列印結果
   public static void printResult(int[] values){
       System.out.println("length:" + values.length);        long start = System.currentTimeMillis();
       System.out.println("result:" + select(values));
       System.out.println("cost:" + (System.currentTimeMillis() - start) + "ms");
       System.out.println("--------------------------------");
   }
   
}


 

2、編寫一個程式求解字謎遊戲問題。

 

          分析:字謎遊戲是從一個二維的字元陣列中按照標量尋找單詞的過程,LZ寫的演算法就是最直觀的演算法,有很多巢狀迴圈,倘若字元表很大的時候,這種方式會很慢。想必書中的後面章節應該會有更簡單的方式,只不過LZ還沒看到,以後有機會改善這個演算法。


import java.util.Random;//字謎問題public class Character {    
   public static final Random RANDOM = new Random(47);    
   public static final String[] WORDS = new String[]{"ynz","yzgm","oqz","owznt","z"};    
   public static void main(String[] args) {        char[][] chars = createTable(5);
       printTable(chars);
       findWord(chars);
   }    //按照標量方向尋找滿足的單詞(或者說字串)
   public static void findWord(char[][] chars){        long start = System.currentTimeMillis();        for (int i = 0; i                            printWord(String.valueOf(chars[i][j]), i, j, k, l);                            continue;
                       }                        if (k != i && j != l && (k - i) != (j - l) && (k - i) != (l - j)) {                            continue;
                       }
                       StringBuffer stringBuffer = new StringBuffer();                        if (i == k) {                            if (j > l) {                                for (int m = j; m >= l; m--) {
                                   stringBuffer.append(chars[i][m]);
                               }
                           }else {                                for (int m = j; m                                    stringBuffer.append(chars[i][m]);
                               }
                           }
                       }                        if (j == l) {                            if (i > k) {                                for (int m = i; m >= k; m--) {
                                   stringBuffer.append(chars[m][j]);
                               }
                           }else {                                for (int m = i; m                                    stringBuffer.append(chars[m][j]);
                               }
                           }
                       }                        if ((k - i) == (j - l)) {                            if (i > k) {                                for (int m = i,n = j; m >= k && n                                    stringBuffer.append(chars[m][n]);
                               }
                           }else {                                for (int m = i,n = j; m = l; m++,n--) {
                                   stringBuffer.append(chars[m][n]);
                               }
                           }
                       }                        if ((k - i) == (l - j)) {                            if (i > k) {                                for (int m = i,n = j; m >= k && n >= l; m--,n--) {
                                   stringBuffer.append(chars[m][n]);
                               }
                           }else {                                for (int m = i,n = j; m                                    stringBuffer.append(chars[m][n]);
                               }
                           }
                       }
                       printWord(stringBuffer.toString(), i, j, k, l);
                   }
               }
           }
       }
       System.out.println("-------------------------------------------------");
       System.out.println("cost time:" + (System.currentTimeMillis() - start) + "ms");
   }    //判斷是否是既定的一個單詞(或字串)並列印
   public static void printWord(String word,int i ,int j,int k,int l){        for (int m = 0; m                System.out.println("find word:" + WORDS[m]);
               System.out.println("scalar:" + "[" + (i+1) + "," + (j+1) + "]->[" + (k+1) + "," + (l+1) + "]");
           }
       }
   }    //建立隨即字元二維陣列
   public static char[][] createTable(int length){        char[][] chars = new char[length][length];        for (int i = 0; i                chars[i][j] = (char)(97 + RANDOM.nextInt(26));
           }
       }        return chars;
   }    //列印二維陣列
   public static void printTable(char[][] chars){
       System.out.println("---------------------------------------------");        for (int i = 0; i            System.out.print("t" + (i+1));
       }
       System.out.println();        for (int i = 0; i            System.out.print((i+1));            for (int j = 0; j                System.out.print("t" + chars[i][j]);
           }
           System.out.println();
       }
       System.out.println("---------------------------------------------");
   }
   
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4798/viewspace-2800515/,如需轉載,請註明出處,否則將追究法律責任。

相關文章