Java面試題總結之數據結構、算法和計算機基礎(劉小牛和絲音的愛情故事1)

 

 

 

Java面試題總結之數據結構、算法和計算機基礎(劉小牛和絲音的愛情故事1)​mp.weixin.qq.com

全文字數: 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();

    }
}
回答完這些問題,絲音看着劉小牛微笑着點點頭說:「」你基礎仍是挺不錯的」。聽到誇讚,劉小牛期待的看着絲音問:「那我能進入天堂了嗎」。絲音笑着說:「天堂哪有那麼好進」。你......未完待續
(本故事純屬虛構,若有雷同純屬巧合)

 

發佈於 10:07
相關文章
相關標籤/搜索