Leetcode刷题——剑指offer_1
Leetcode刷題——?jiǎng)χ竜ffer_1
- 劍指offer_03 數(shù)組中重復(fù)的數(shù)字
- 劍指offer_04 二維數(shù)組中元素的查找
- 劍指offer_05 替換空格
- 劍指offer_06 從尾到頭打印鏈表
- 劍指offer_07 重建二叉樹
- 劍指offer_09 用兩個(gè)棧實(shí)現(xiàn)隊(duì)列
- 劍指offer_10 -I 用兩個(gè)棧實(shí)現(xiàn)隊(duì)列
- 劍指offer_10 -II 青蛙跳臺(tái)階問(wèn)題
- 劍指offer_11 旋轉(zhuǎn)數(shù)組的最小數(shù)字
無(wú)關(guān)風(fēng)月,我提筆等你回
劍指offer_03 數(shù)組中重復(fù)的數(shù)字
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(集合),將數(shù)組中的元素導(dǎo)入到集合中,判斷是否集合中含有,如果有則表示重復(fù)
劍指offer_04 二維數(shù)組中元素的查找
* 求二維數(shù)組是否含有該數(shù)字* 二維數(shù)組 每行都遞增,每列都遞增* 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++;} //利用遞增關(guān)系else if(target<matrix[i][j]){i--;}else { return true;}}return false;} }題目:在一個(gè) n * m 的二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請(qǐng)完成一個(gè)高效的函數(shù),輸入這樣的一個(gè)二維數(shù)組和一個(gè)整數(shù),判斷數(shù)組中是否含有該整數(shù)。
思想:每行都遞增,每列都遞增;
因此決定從左下角出發(fā),i,j控制的矩陣的元素的位置,每經(jīng)過(guò)一個(gè)點(diǎn)可以判斷與target的關(guān)系,憑借不同的大小關(guān)系可以消除對(duì)應(yīng)的行和列,如果相等則說(shuō)明存在,遍歷完整個(gè)矩陣,則說(shuō)明不存在,返回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();} }請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù),把字符串 s 中的每個(gè)空格替換成"%20"。
劍指offer_06 從尾到頭打印鏈表
輸入一個(gè)鏈表的頭節(jié)點(diǎn),從尾到頭反過(guò)來(lái)返回每個(gè)節(jié)點(diǎn)的值(用數(shù)組返回)。
使用列表和數(shù)組將鏈表逆序輸出
遞歸或者回溯
劍指offer_07 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結(jié)果,請(qǐng)構(gòu)建該二叉樹并返回其根節(jié)點(diǎn)。
假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中都不含重復(fù)的數(shù)字。
二叉樹的問(wèn)題首先要考慮到遞歸,大概率是將根節(jié)點(diǎn),根節(jié)點(diǎn)的左子樹,根節(jié)點(diǎn)的右子樹 三個(gè)方面進(jìn)行考慮!!!然后重建二叉樹的話,首先中序遍歷+前序遍歷可以區(qū)分左右子樹和確定根節(jié)點(diǎn)(特點(diǎn)), 并且采用遞歸的方式進(jìn)行二叉樹的建立,
首先要建立中序數(shù)組值與序號(hào)的映射關(guān)系,hashmap
通過(guò)前序遍歷確定根節(jié)點(diǎn),通過(guò)中序遍歷區(qū)分子樹
遞歸的方式進(jìn)行樹的建立,首先得到根節(jié)點(diǎn)在中序遍歷的位置,用于區(qū)分左子樹和右子樹,//遍歷左子樹 //遍歷右子樹 前序遍歷中的右子樹的根節(jié)點(diǎn) root+(左子樹的長(zhǎng)度)+1
劍指offer_09 用兩個(gè)棧實(shí)現(xiàn)隊(duì)列
用兩個(gè)棧實(shí)現(xiàn)一個(gè)隊(duì)列。隊(duì)列的聲明如下,請(qǐng)實(shí)現(xiàn)它的兩個(gè)函數(shù) appendTail 和 deleteHead ,分別完成在隊(duì)列尾部插入整數(shù)和在隊(duì)列頭部刪除整數(shù)的功能。(若隊(duì)列中沒(méi)有元素,deleteHead 操作返回 -1 )
思想:主要還是在刪除元素時(shí)做文章,考慮到元素要先進(jìn)先出的特性,即刪除的時(shí)候要?jiǎng)h最先進(jìn)去的那個(gè),所以用第二個(gè)棧來(lái)保存待刪除的元素們,如果遇到刪除操作,首先如果第二個(gè)棧不空,直接刪除,反正將第一個(gè)棧的所有元素彈出進(jìn)入到第二棧中,然后進(jìn)行刪除!!!!
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 用兩個(gè)棧實(shí)現(xiàn)隊(duì)列
斐波那契數(shù)列:寫一個(gè)函數(shù),輸入 n ,求斐波那契(Fibonacci)數(shù)列的第 n 項(xiàng)(即 F(N))。斐波那契數(shù)列的定義如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
采用數(shù)組記錄值的方式來(lái)進(jìn)行數(shù)列的計(jì)算,遞歸會(huì)溢出
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 青蛙跳臺(tái)階問(wèn)題
一只青蛙一次可以跳上1級(jí)臺(tái)階,也可以跳上2級(jí)臺(tái)階。求該青蛙跳上一個(gè) n 級(jí)的臺(tái)階總共有多少種跳法。
思想:類似于動(dòng)態(tài)規(guī)劃吧,考慮到第n個(gè)臺(tái)階,則它可以由n-1 和 n-2個(gè)臺(tái)階 跳1 或者2 到達(dá);類似于上一問(wèn)
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 旋轉(zhuǎn)數(shù)組的最小數(shù)字
把一個(gè)數(shù)組最開始的若干個(gè)元素搬到數(shù)組的末尾,我們稱之為數(shù)組的旋轉(zhuǎn)。
給你一個(gè)可能存在 重復(fù) 元素值的數(shù)組 numbers ,它原來(lái)是一個(gè)升序排列的數(shù)組,并按上述情形進(jìn)行了一次旋轉(zhuǎn)。請(qǐng)返回旋轉(zhuǎn)數(shù)組的最小元素。例如,數(shù)組 [3,4,5,1,2] 為 [1,2,3,4,5] 的一次旋轉(zhuǎn),該數(shù)組的最小值為 1。
考慮的數(shù)組是局部遞增的;因此選擇比較相鄰的元素,如果發(fā)現(xiàn)前者大于后者的話,則說(shuō)明該元素為旋轉(zhuǎn)數(shù)組的起點(diǎn)
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];}總結(jié)
以上是生活随笔為你收集整理的Leetcode刷题——剑指offer_1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【编译原理】Python语法分析LL(1
- 下一篇: 可汗学院统计学笔记