一、數據結構與算法基礎
1.說一下幾種常見的排序算法和分別的復雜度。
冒泡排序
核心思想:遍歷數組N次,每次將最大的數字交換到最后。
時間復雜度:O(N2)
空間復雜度:O(1)快速排序
核心思想:選擇一個基準數,比它小的數放左邊,比它大的數放右邊,依次遞歸。
時間復雜度:最壞情況 O(N2),平均 O(N*lgN)
空間復雜度:主要來源于遞歸棧,因此最多O(N) 最少 O(lgN)插入排序
核心思想:打撲克牌時摸牌階段的排序。
時間復雜度:O(N2)
空間復雜度:O(1)選擇排序
核心思想:從沒有排序的數列中找到最小的放在最前面,不停重復。(和冒泡類似)
時間復雜度:O(N2)
空間復雜度:O(1)堆排序
核心思想:利用“最大堆”(最小堆類似)每次找出最大的值,從而形成有序數組。
時間復雜度:O(N*lgN)
空間復雜度:O(1)歸并排序
核心思想:將兩個有序數組合并成一個數組,利用遞歸,從兩個單個元素開始一直到一整個數組。
時間復雜度:O(N*lgN)
空間復雜度:O(N),在合并數組時需要借助新的空間。
2.用Java寫一個冒泡排序算法
public static void bubble(int[] arr) {
for (int i = arr.length - 1; i >= 0; i--) {
for (int j = 0; j < i; j++) {
if (arr[j] > arr[i]) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
}
3.描述一下鏈式存儲結構。
常見的鏈式存儲結構有單向鏈表和雙向鏈表。鏈表的結構特點就是有一個值字段,同時有指向下一個結點或者上一個結點的字段。java中定義如下:
//單向鏈表
public class ListNode {
int val;
ListNode next;
}
//雙向鏈表
public class ListNode {
int val;
ListNode pre;
ListNode next;
}
4.如何遍歷一棵二叉樹?
二叉樹的遍歷有前序遍歷,中序遍歷和后續遍歷??梢允褂眠f歸來完成,亦可使用循環的方式完成。
5.倒排一個LinkedList。
- 方法1:如果利用一個棧來存放,那么依次入棧,再依次出棧即可立即完成倒排。
- 方法2:從左往右依次倒排,進行到
i
的位置時,i
前面的是倒排的,i
后面還是順排的。
6.用Java寫一個遞歸遍歷目錄下面的所有文件。
//遍歷一個目錄下所有的文件
public static void ScanFiles(File file) {
if (file == null || !file.exists()) {
return;
}
if (!file.isDirectory()) {
System.out.println(file.getName());
} else {
File[] files = file.listFiles();
if (files != null) {
for (File f : files) {
ScanFiles(f);
}
}
}
}
目錄列表
一、數據結構與算法基礎
二、Java基礎
三、JVM
四、多線程/并發
五、Linux使用與問題分析排查
六、框架使用
七、數據庫相關
八、網絡協議和網絡編程
九、Redis等緩存系統/中間件/NoSQL/一致性Hash等
十、設計模式與重構
本文是針對知乎文章《成為Java頂尖程序員,先過了下面問題》的解答