Leetcode刷题——剑指offer_1
Leetcode刷題——劍指offer_1
- 劍指offer_03 數組中重復的數字
- 劍指offer_04 二維數組中元素的查找
- 劍指offer_05 替換空格
- 劍指offer_06 從尾到頭打印鏈表
- 劍指offer_07 重建二叉樹
- 劍指offer_09 用兩個棧實現隊列
- 劍指offer_10 -I 用兩個棧實現隊列
- 劍指offer_10 -II 青蛙跳臺階問題
- 劍指offer_11 旋轉數組的最小數字
無關風月,我提筆等你回
劍指offer_03 數組中重復的數字
public int findRepeatNumber(int[] nums) {//集合HashSet hashSet=new HashSet();for (int i=0;i<nums.length; i++) {if (!(hashSet.contains(nums[i]))){hashSet.add(nums[i]);}else {return nums[i];}}return -1;}使用hashset(集合),將數組中的元素導入到集合中,判斷是否集合中含有,如果有則表示重復
劍指offer_04 二維數組中元素的查找
* 求二維數組是否含有該數字* 二維數組 每行都遞增,每列都遞增* n*m*/ public class offer_4 {public boolean findNumberIn2DArray(int[][] matrix, int target) {int i=matrix[0].length-1;int j=0;while (i>=0 && j<= matrix[0].length){if (target>matrix[i][j]){j++;} //利用遞增關系else if(target<matrix[i][j]){i--;}else { return true;}}return false;} }題目:在一個 n * m 的二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個高效的函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
思想:每行都遞增,每列都遞增;
因此決定從左下角出發,i,j控制的矩陣的元素的位置,每經過一個點可以判斷與target的關系,憑借不同的大小關系可以消除對應的行和列,如果相等則說明存在,遍歷完整個矩陣,則說明不存在,返回FALSE
劍指offer_05 替換空格
/*** @author shkstart* @create 2022-07-13 下午11:18* 字符串替換* StringBuilder 是可以變得*/ public class offer_5 {public String replaceSpace(String s) {StringBuilder s1=new StringBuilder();for (char c:s.toCharArray()) {if (c==' '){s1.append("%20");}else {s1.append(c);}}return s1.toString();} }請實現一個函數,把字符串 s 中的每個空格替換成"%20"。
劍指offer_06 從尾到頭打印鏈表
輸入一個鏈表的頭節點,從尾到頭反過來返回每個節點的值(用數組返回)。
使用列表和數組將鏈表逆序輸出
遞歸或者回溯
劍指offer_07 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請構建該二叉樹并返回其根節點。
假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字。
二叉樹的問題首先要考慮到遞歸,大概率是將根節點,根節點的左子樹,根節點的右子樹 三個方面進行考慮!!!然后重建二叉樹的話,首先中序遍歷+前序遍歷可以區分左右子樹和確定根節點(特點), 并且采用遞歸的方式進行二叉樹的建立,
首先要建立中序數組值與序號的映射關系,hashmap
通過前序遍歷確定根節點,通過中序遍歷區分子樹
遞歸的方式進行樹的建立,首先得到根節點在中序遍歷的位置,用于區分左子樹和右子樹,//遍歷左子樹 //遍歷右子樹 前序遍歷中的右子樹的根節點 root+(左子樹的長度)+1
劍指offer_09 用兩個棧實現隊列
用兩個棧實現一個隊列。隊列的聲明如下,請實現它的兩個函數 appendTail 和 deleteHead ,分別完成在隊列尾部插入整數和在隊列頭部刪除整數的功能。(若隊列中沒有元素,deleteHead 操作返回 -1 )
思想:主要還是在刪除元素時做文章,考慮到元素要先進先出的特性,即刪除的時候要刪最先進去的那個,所以用第二個棧來保存待刪除的元素們,如果遇到刪除操作,首先如果第二個棧不空,直接刪除,反正將第一個棧的所有元素彈出進入到第二棧中,然后進行刪除!!!!
public class offer_9 { class CQueue {LinkedList<Integer> stack1,stack2;public CQueue() {stack1=new LinkedList<Integer>();stack2=new LinkedList<Integer>();}public void appendTail(int value) {stack1.addLast(value);}public int deleteHead() {if(!(stack2.isEmpty())) return stack2.removeLast();if(stack1.isEmpty())return -1;while(!stack1.isEmpty()) {stack2.addLast(stack1.removeLast());}return stack2.removeLast();} }劍指offer_10 -I 用兩個棧實現隊列
斐波那契數列:寫一個函數,輸入 n ,求斐波那契(Fibonacci)數列的第 n 項(即 F(N))。斐波那契數列的定義如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
采用數組記錄值的方式來進行數列的計算,遞歸會溢出
public int fib(int n) {if (n == 0) {return 0;}int[] number=new int[n+1];number[0] = 0;number[1] = 1;for (int i = 2; i <= n; i++) {number[i]=number[i-1]+number[i-2];number[i]=number[i]%1000000007;}return number[n];}劍指offer_10 -II 青蛙跳臺階問題
一只青蛙一次可以跳上1級臺階,也可以跳上2級臺階。求該青蛙跳上一個 n 級的臺階總共有多少種跳法。
思想:類似于動態規劃吧,考慮到第n個臺階,則它可以由n-1 和 n-2個臺階 跳1 或者2 到達;類似于上一問
public int fib(int n) {if (n == 0 ||n==1) {return 1;}int[] number=new int[n+1];number[0] = 1;number[1] = 1;number[2]=number[0]+number[1];for (int i = 2; i <= n; i++) {number[i]=number[i-1]+number[i-2];number[i]=number[i]%1000000007;}return number[n];}劍指offer_11 旋轉數組的最小數字
把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。
給你一個可能存在 重復 元素值的數組 numbers ,它原來是一個升序排列的數組,并按上述情形進行了一次旋轉。請返回旋轉數組的最小元素。例如,數組 [3,4,5,1,2] 為 [1,2,3,4,5] 的一次旋轉,該數組的最小值為 1。
考慮的數組是局部遞增的;因此選擇比較相鄰的元素,如果發現前者大于后者的話,則說明該元素為旋轉數組的起點
public int minArray(int[] numbers) {int i,flag=0;for (i = 0; i < numbers.length-1; i++) {if (numbers[i]>numbers[i+1]){flag=1;break;}}return flag==0?numbers[0]:numbers[i+1];}總結
以上是生活随笔為你收集整理的Leetcode刷题——剑指offer_1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【编译原理】Python语法分析LL(1
- 下一篇: 可汗学院统计学笔记