LintCode/LeetCode訓練題目&答案詳解—基礎篇
一、在二叉樹中尋找值最大的節點並返回:
給出如下一棵二叉樹:
1
/ \
-5 2
/ \ / \
0 3 -4 -5
返回值為 3 的節點。
public class Solution {
/**
* @param root the root of binary tree
* @return the max node
*/
public TreeNode maxNode(TreeNode root) {
if (root == null) {
return null;
}
return getMaxTreeNode(root);
}
private TreeNode getMaxTreeNode(TreeNode root) {
if (root == null) {
return new TreeNode(Integer.MIN_VALUE);
}
TreeNode left = getMaxTreeNode(root.left);
TreeNode right = getMaxTreeNode(root.right);
if (root.val > left.val && root.val > right.val) {
return root;
} else if (right.val > left.val && right.val > root.val) {
return right;
}
return left;
}
}
簡析:使用了遞迴的思想;注意為空的判斷;
二、單例
單例 是最為最常見的設計模式之一。對於任何時刻,如果某個類只存在且最多存在一個具體的例項,那麼我們稱這種設計模式為單例。例如,對於 class Mouse (不是動物的mouse哦),我們應將其設計為 singleton 模式。
你的任務是設計一個 getInstance 方法,對於給定的類,每次呼叫 getInstance 時,都可得到同一個例項。
樣例:
在 Java 中:
A a = A.getInstance();
A b = A.getInstance();
a 應等於 b.
挑戰:
如果併發的呼叫 getInstance,你的程式也可以正確的執行麼?
class Solution {
private volatile static Solution mInstance = null;
/**
* @return: The same instance of this class every time
*/
public static Solution getInstance() {
if (mInstance == null) {
synchronized(Solution.class) {
if (mInstance == null) {
mInstance = new Solution();
}
}
}
return mInstance;
}
private Solution() {}
}
注意:實現一個單例有兩點注意事項,①將構造器私有,不允許外界通過構造器建立物件;②通過公開的靜態方法向外界返回類的唯一例項
參考:單例模式的幾種寫法對比:
http://wuchong.me/blog/2014/08/28/how-to-correctly-write-singleton-pattern/
三、整數排序
給一組整數,按照升序排序,使用選擇排序,氣泡排序,插入排序或者任何 O(n2) 的排序演算法。
樣例:
對於陣列 [3, 2, 1, 4, 5], 排序後為:[1, 2, 3, 4, 5]。
答案(java版本):
選擇排序:
public void sortIntegers(int[] A) {
int i, j, min, temp, len = A.length;
for (i = 0; i < len -1; i++) {
min = i; //未排序序列中最小資料陣列下標
for (j = i + 1; j < len; j++) { //在未排序元素中繼續尋找最小元素,並儲存其下標
if (A[min] > A[j]) {
min = j;
}
}
if (i != min) { //將最小元素放到已排序序列的末尾
temp = A[min];
A[min] = A[i];
A[i] = temp;
}
}
}
氣泡排序:
public void sortIntegers(int[] A) {
int i, j, temp, len = A.length;
for (i = 0; i < len - 1; i++) {
for (j = 0; j < len - i - 1; j ++)
if (A[j] > A[j+1]) {
temp = A[j+1];
A[j+1] = A[j];
A[j] = temp;
}
}
}
答案解析:
各個語言的實現請參考維基百科:https://zh.wikipedia.org/wiki/%E9%80%89%E6%8B%A9%E6%8E%92%E5%BA%8F
** 四、斐波那契數列**
查詢斐波納契數列中第 N 個數。所謂的斐波納契數列是指:
前2個數是 0 和 1 。
第 i 個數是第 i-1 個數和第i-2 個數的和。
斐波納契數列的前10個數字是:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ...
答案:
public int fibonacci(int n) {
// write your code here
int a1 = 0;
int a2 = 1;
int result = 0;
if (n == 1) {
return a1;
}
if (n == 2) {
return a2;
}
for (int i = 3; i <= n; i++) {
result = a1 + a2;
a1 = a2;
a2 = result;
}
return result;
}
注意事項:
1、n是從1開始的,而不是0
2、一般我們都會想到用遞迴的方式實現,但是這個時間開銷很大:
int fibonacci(int n) {
if (n == 1)
return 0;
else if (n == 2)
return 1;
return fib(n-1) + fib(n-2);
}
3、題目的引申: 青蛙跳階梯,鋪方磚
參考:http://www.bubuko.com/infodetail-1099705.html
相關文章
- Java基礎面試題型整理,附帶答案詳解Java面試題
- 16道Linux基礎命令題目及答案彙總!Linux
- [基礎訓練]數列排序排序
- ACM訓練方案-POJ題目分類ACM
- Java每日基礎恢復訓練Java
- Java基礎 --- 物件導向綜合訓練Java物件
- MongoDB資料庫操作詳解:基礎篇MongoDB資料庫
- JS基礎篇–正規表示式詳解JS
- JAVA 基礎練習題Java
- Dubbo面試25題答案詳解面試
- leetcode解題目錄LeetCode
- 領釦LintCode演算法問題答案-1886. 目標移動演算法
- C#網路應用程式設計基礎練習題與答案(1)C#程式設計
- Java基礎面試題整理-50題(附答案)Java面試題
- 【LLM訓練系列】NanoGPT原始碼詳解和中文GPT訓練實踐NaNGPT原始碼
- Android ORM 框架:GreenDao 使用詳解(基礎篇)AndroidORM框架
- 50道CSS基礎面試題(附答案)CSS面試題
- 50道 CSS 基礎面試題(附答案CSS面試題
- linux基礎練習題Linux
- Python基礎練習題Python
- oracle 客戶培訓上機操作練習題目Oracle
- P5655 基礎數論函式練習題 題解函式
- python基礎題目大全,測試你的水平,鞏固知識(含答案)Python
- java基礎題目總結Java
- Pytorch版Faster R-CNN 原始碼分析+方法流程詳解——訓練篇PyTorchASTCNN原始碼
- deepspeed基礎入門 cifar的訓練
- 【學校訓練記錄】10月個人訓練賽3個人題解
- [leetcode/lintcode 題解] 微軟 面試題:實現 Trie(字首樹)LeetCode微軟面試題
- 詳解 Android 中的 IPC 機制:基礎篇Android
- acm訓練題ACM
- .NET 雲原生架構師訓練營(模組二 基礎鞏固 RabbitMQ Masstransit 詳解)--學習筆記架構MQ筆記
- 如何訓練解決問題的能力?
- [題目記錄]一本通高手訓練-數列
- XYCTF pwn部分題解 (部分題目詳解)
- 【備戰春招/秋招系列】美團面經總結基礎篇 (附詳解答案)
- BTA 常問的 Java基礎40道常見面試題及詳細答案Java面試題
- Leetcode已刷題目題解彙總LeetCode
- Java語言程式設計基礎篇第十版第一章程式設計練習題答案Java程式設計