java演算法題
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還沒看到,以後有機會改善這個演算法。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java演算法面試題(009) 毒酒問題Java演算法面試題
- (Java) 演算法題:2的N次方Java演算法
- java解一些演算法題Java演算法
- Java在演算法題中的輸入問題Java演算法
- Java演算法面試題(006) 相遇問題(阿里)Java演算法面試題阿里
- 演算法問題基於蟻群演算法求解求解TSP問題(JAVA)演算法Java
- 基礎演算法題——整除光棍(Java大數)演算法Java
- [2]十道演算法題【Java實現】演算法Java
- Java演算法面試題(008) 字串反轉Java演算法面試題字串
- Java演算法面試題(007) 蒙提霍爾問題(三門問題)Java演算法面試題
- 25道經典Java演算法題(含程式碼)Java演算法
- Java入門(String的3個演算法題)Java演算法
- java面試一日一題:java中垃圾回收演算法有哪些Java面試演算法
- leetcode演算法題解(Java版)-9-N皇后問題LeetCode演算法Java
- 蟻群演算法java實現以及TSP問題蟻群演算法求解演算法Java
- LeetCode演算法題-Number of Boomerangs(Java實現)LeetCode演算法OOMJava
- 蟻群演算法實現TSP(旅行商)問題(java)演算法Java
- 轉:八皇后問題 java實現,演算法兩則Java演算法
- 演算法--Java演算法Java
- leetcode演算法題解(Java版)-14-第k小數問題LeetCode演算法Java
- 藍橋杯 演算法訓練 K好數(Java解題)演算法Java
- 一道java面試題,演算法,求大家幫忙解答!Java面試題演算法
- 演算法題演算法
- 演算法題:洗牌演算法演算法
- 【演算法題】任務分配問題---匈牙利演算法演算法
- 排序演算法-Java排序演算法Java
- Java演算法之路Java演算法
- java常用演算法Java演算法
- LeetCode演算法題-Next Greater Element I(Java實現)LeetCode演算法Java
- 【演算法題解】485. 最大連續1的個數 - Java演算法Java
- leetcode演算法題解(Java版)-3-廣搜+HashMapLeetCode演算法JavaHashMap
- 【JAVA演算法】排序演算法 -- 快速排序Java演算法排序
- 演算法面試題演算法面試題
- 【JAVA演算法】圖論演算法 -- Dijkstra演算法Java演算法圖論
- 【演算法資料結構Java實現】Java實現動態規劃(揹包問題)演算法資料結構Java動態規劃
- leetcode演算法題解(Java版)-12-中序遍歷LeetCode演算法Java
- 藍橋杯 演算法提高 P0102(Java解題)演算法Java
- leetcode演算法題解(Java版)-16-動態規劃(單詞包含問題)LeetCode演算法Java動態規劃