Java面試題總結之數據結構、算法和計算機基礎(劉小牛和絲音的愛情故事1)
全文字數: 1703java
閱讀時間: 大約6 分鐘node
劉小牛是一名Java程序員,因爲每天996日常也不注意鍛鍊身體,一不當心就進入了ICU,最終搶救無效,告別了人間。死後的劉小牛,被告知須要進入天堂或者地獄,進入天堂須要有一技之長,劉小牛固然想進入天堂了,他思來想去本身也只會敲代碼了,因此他來到了天堂的大門前,準備應聘Java程序員,玉帝和王母最疼愛的女兒絲音接待了他,絲音對他說,想要應聘咱們天堂的程序員可不簡單,我須要問你幾個問題,答對了咱們纔會錄用你,讓你進入天堂工做,不然你仍是去地獄吧,劉小牛說沒問題,我這麼多年程序員也不是白乾的,這點我仍是有信心的。下面是他和絲音的對話。
絲音:你知道一個byte 幾個bit位嗎?程序員
劉小牛:這個問題太簡單了,一個Byte是8bit。面試
絲音:經常使用UNIX 命令有哪些(Linux 的經常使用命令)(至少10 個)?算法
劉小牛:unix經常使用命令有:數組
ls 顯示指定目錄下的文件目錄清單至關於dos下的dir命令。
pwd 顯示當前目錄。
mkdir 在當前目錄下建立目錄。
rm 刪除文件或目錄。
cp 複製文件。
mv 移動文件。
cd 切換工做目錄。
ps 查看進程。
ftp 傳送文件。
telnet 遠程登陸命令。
ping 用來測試本機與目標主機是否聯通。
env 查看當前系統中的環境變量。
more 分屏顯示指定文件的內容。
echo在終端上顯示你要顯示的內容,向C語言中的printf函數。
絲音:嗯嗯不錯,下一個問題,後序遍歷下列二叉樹,訪問結點的順序是什麼?數據結構
劉小牛:這問題也太簡單了,訪問順序爲:DJGEBKNIFCA 。:順序爲:DJGEBKNIFCA 。函數
絲音:哼,敢小瞧咱們天堂的題,下一道題,排序都有哪幾種方法?請列舉說明,而後用JAVA 實現一個快速排序。測試
劉小牛:排序的方法有:插入排序(直接插入排序、希爾排序),交換排序(冒泡排序、快速排序),選擇排序(直接選擇排序、堆排序),歸併排序,分配排序(桶排序、基數排序);ui
/* * 使用快速排序方法對arr[0:n- 1]排序 從a[ 0 :n- 1 ]中選擇一個元素做爲middle,該元素爲支點; 把餘下的元素分割爲兩段left 和right,使得left 中的元素都小於等於支點, 而right 中的元素都大於等於支點; 遞歸地使用快速排序方法對left 進行排序; 遞歸地使用快速排序方法對right 進行排序; 所得結果爲left + middle + right。 */ public class QuickSort { public static void main(String[] args) { int[] arr = {5,2,4,9,7,16,26,3}; sort(arr, 0, arr.length - 1); } public static void sort(int arr[], int left, int hight) { int l = left; int h = hight; int k = arr[left]; while (l < h) { // 從後往前比較 // 若是沒有比關鍵值小的,比較下一個,直到有比關鍵值小的交換位置, // 而後再從前日後比較 while (l < h && arr[h] > k) { h--;// h=6 } // 交換位置 if (l < h) { int temp = arr[h]; arr[h] = arr[l]; arr[l] = temp; // 進行過一次替換後,不必將替換後的兩值再次比較,因此i++直接下一位與k對比 l++; } // 從前日後比較 若是沒有比關鍵值大的,比較下一個, // 直到有比關鍵值大的交換位置 while (l < h && arr[l] <= k) { l++; } // 交換位置 if (l < h) { int temp = arr[h]; arr[h] = arr[l]; arr[l] = temp; h--; } // 此時第一次循環比較結束,關鍵值的位置已經肯定了。左邊的值都比關鍵值小,右邊的值都比關鍵值大, // 可是左右兩邊的順序還有多是不同的,進行下面的遞歸調用 } print(arr); System.out.print("l=" + (l + 1) + ",h=" + (h + 1) + ",k=" + k + "\n"); // 遞歸,先判斷l>low再次進行左邊排序 if (l > left) { // 左邊序列。第一個索引位置到關鍵值索引-1 sort(arr, left, l - 1); } // 左邊依次排序執行完遞歸後,彈棧進行右邊排序 if (h < hight) { // 右邊序列。從關鍵值索引+1到最後一個 sort(arr, l + 1, hight); } } // 打印數組的方法 public static void print(int[] arr) { System.out.print("["); for (int i = 0; i < arr.length; i++) { if (i != (arr.length - 1)) { System.out.print(arr[i] + ","); } else { System.out.print(arr[i] + "]"); System.out.println(); } } } }
劉小牛把在紙上寫好的代碼遞給了絲音。
絲音:嗯嗯,寫的不錯,看不出來你還挺厲害的呀,好再問你一個簡單的問題,寫一個程序判斷數字是否爲質數?
劉小牛:這個簡單,程序以下:
/** * 一、偶數不多是質數 * 二、對於大於2的數,若是一個數a大於數b的一半,那麼b不可能被a整除 */ public boolean isPrimeNum(int num) { // 2特殊處理 if (num == 2) { return true; } // 識別小於2的數和偶數 if (num < 2 || num % 2 == 0) { return false; } int max = num / 2; for (int i = 3; i < max; i += 2) { if (num % i == 0) { return false; } } return true; }
絲音:給你出一道可貴吧,這個題有好多之前應聘的人都沒答對呢,設有n我的依圍成一圈,從第1我的開始報數,數到第m我的出列,而後從出列的下一我的開始報數,數到第m我的又出列,…,如此反覆到全部的人所有出列爲止。設n我的的編號分別爲1,2,…,n,打印出出列的順序;要求用java 實現。
劉小牛:這道題難不倒我,代碼以下:
public class CountGame { //判斷第n我的是否已經出列 private static boolean same(int[] p, int l, int n) { for (int i = 0; i < l; i++) { if (p[i] == n) { return true; } } return false; } public static void play(int playerNum, int step) { //按出列順序排列的新數組 int[] p = new int[playerNum]; //當前報數的人 int counter = 1; while (true) { if (counter > playerNum * step) { break; } //從1開始報數 for (int i = 1; i < playerNum + 1; i++) { while (true) { //若是報數的人已經出去,則跳過 if (same(p, playerNum, i) == false){ break; } else{ i = i + 1; } } if (i > playerNum){ break; } //若是當前報數的人是第m我的,則第M我的出列 if (counter % step == 0) { System.out.print(i + " "); p[counter / step - 1] = i; } counter += 1; } } System.out.println(); } public static void main(String[] args) { //一共10我的,輸到第7我的出列 play(10, 7); } }
絲音:哇,你真厲害呀,最後一個問題,用程序實現1000 的階乘。
劉小牛:這個問題有個陷阱,就是普通的數據類型存不了這麼大的數,不過這難不倒個人,嘿嘿
Java的代碼實現以下:
//首先導入大數包和輸入包 import java.math.BigInteger; import java.util.Scanner; //計算n!(1*2*...*n) public class BigIntegerTestDrive { public static void main(String[] args) { // 輸入n Scanner in = new Scanner(System.in); int n = in.nextInt(); // 輸入初始值 int pre_answer = 1; // 將初始值由int類型轉變爲String類型 String x = String.valueOf(pre_answer); // 將String類型的的初始值,傳遞給BigInteger類型, BigInteger answer = new BigInteger(x); // 循環迭代逐次相乘 for (int i = 1; i <= n; i++) { // 由於BigInteger類型只能和該類型的變量相乘,所以還需將每次的中間乘數也依次變爲BigInteger類型 String var = String.valueOf(i); BigInteger variable = new BigInteger(var); // 調用相乘函數進行相乘運算 answer = answer.multiply(variable); } // 輸出最終答案 System.out.println(answer); in.close(); } }
回答完這些問題,絲音看着劉小牛微笑着點點頭說:「」你基礎仍是挺不錯的」。聽到誇讚,劉小牛期待的看着絲音問:「那我能進入天堂了嗎」。絲音笑着說:「天堂哪有那麼好進」。你......未完待續
(本故事純屬虛構,若有雷同純屬巧合)