日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Leetcode刷题——剑指offer_1

發(fā)布時(shí)間:2023/12/15 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Leetcode刷题——剑指offer_1 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Leetcode刷題——?jiǎng)χ竜ffer_1

  • 劍指offer_03 數(shù)組中重復(fù)的數(shù)字
  • 劍指offer_04 二維數(shù)組中元素的查找
  • 劍指offer_05 替換空格
  • 劍指offer_06 從尾到頭打印鏈表
  • 劍指offer_07 重建二叉樹(shù)
  • 劍指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ù)組將鏈表逆序輸出
遞歸或者回溯

/*** @author shkstart* @create 2022-07-13 下午11:45* 使用列表和數(shù)組將鏈表逆序輸出* 遞歸或者回溯*/ public class offer_6 {public class ListNode {int val;ListNode next;ListNode(int x) { val = x; } }ArrayList<Integer> tmp=new ArrayList<Integer>();public int[] reversePrint1(ListNode head){recur(head);int[] res=new int[tmp.size()];for (int i = 0; i < res.length; i++) {res[i]= tmp.get(i);}return res;}//對(duì)鏈表進(jìn)行遍歷public void recur(ListNode head){if (head ==null){return;}recur(head.next);tmp.add(head.val);}public int[] reversePrint2(ListNode head){ //利用棧的特性LinkedList<Integer> stack=new LinkedList<Integer>();while (head !=null){stack.addLast(head.val);head=head.next;}int[] res=new int[stack.size()];for (int j = 0; j < res.length; j++) {res[j]= stack.removeLast();}return res;} }

劍指offer_07 重建二叉樹(shù)

輸入某二叉樹(shù)的前序遍歷和中序遍歷的結(jié)果,請(qǐng)構(gòu)建該二叉樹(shù)并返回其根節(jié)點(diǎn)。
假設(shè)輸入的前序遍歷和中序遍歷的結(jié)果中都不含重復(fù)的數(shù)字。

二叉樹(shù)的問(wèn)題首先要考慮到遞歸,大概率是將根節(jié)點(diǎn),根節(jié)點(diǎn)的左子樹(shù),根節(jié)點(diǎn)的右子樹(shù) 三個(gè)方面進(jìn)行考慮!!!然后重建二叉樹(shù)的話,首先中序遍歷+前序遍歷可以區(qū)分左右子樹(shù)和確定根節(jié)點(diǎn)(特點(diǎn)), 并且采用遞歸的方式進(jìn)行二叉樹(shù)的建立,

首先要建立中序數(shù)組值與序號(hào)的映射關(guān)系,hashmap
通過(guò)前序遍歷確定根節(jié)點(diǎn),通過(guò)中序遍歷區(qū)分子樹(shù)
遞歸的方式進(jìn)行樹(shù)的建立,首先得到根節(jié)點(diǎn)在中序遍歷的位置,用于區(qū)分左子樹(shù)和右子樹(shù),//遍歷左子樹(shù) //遍歷右子樹(shù) 前序遍歷中的右子樹(shù)的根節(jié)點(diǎn) root+(左子樹(shù)的長(zhǎng)度)+1

public class offer_7 {class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }}int preorder[];HashMap<Integer,Integer> hashMap=new HashMap<Integer,Integer>();public TreeNode buildTree(int[] preorder, int[] inorder) {this.preorder=preorder;//首先要建立中序數(shù)組值與序號(hào)的映射關(guān)系for (int i = 0; i < inorder.length; i++) {hashMap.put(inorder[i],i);}return Recur(0,0, inorder.length-1);}//root 為先序遍歷上的值, left right為中序遍歷上的值//通過(guò)前序遍歷確定根節(jié)點(diǎn),通過(guò)中序遍歷區(qū)分子樹(shù)//默認(rèn)使用的數(shù)組為先序數(shù)組public TreeNode Recur(int root,int left,int right){if (left>right){return null;}TreeNode node=new TreeNode(preorder[root]);//得到根節(jié)點(diǎn)在中序遍歷的位置,用于區(qū)分左子樹(shù)和右子樹(shù)int i=hashMap.get(preorder[root]);//遍歷左子樹(shù)node.left=Recur(root+1,left,i-1);//遍歷右子樹(shù) 前序遍歷中的右子樹(shù)的根節(jié)點(diǎn) root+(左子樹(shù)的長(zhǎng)度)+1node.right=Recur(root+1+i-left,i+1,right);return node;}

劍指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ù)列:寫(xiě)一個(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)階總共有多少種跳法。

思想:類(lèi)似于動(dòng)態(tài)規(guī)劃吧,考慮到第n個(gè)臺(tái)階,則它可以由n-1 和 n-2個(gè)臺(tái)階 跳1 或者2 到達(dá);類(lèi)似于上一問(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ù)組最開(kāi)始的若干個(gè)元素搬到數(shù)組的末尾,我們稱(chēng)之為數(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。