劍指offer:12-17記錄

請設計一個函數,用來判斷在一個矩陣中是否存在一條包含某字符串所有字符的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左、右、上、下移動一格。如果一條路徑經過了矩陣的某一格,那么該路徑不能再次進入該格子。例如,在下面的3×4的矩陣中包含一條字符串“bfce”的路徑(路徑中的字母用加粗標出)。

[["a","b","c","e"],
["s","f","c","s"],
["a","d","e","e"]]

但矩陣中不包含字符串“abfb”的路徑,因為字符串的第一個字符b占據了矩陣中的第一行第二個格子之后,路徑不能再次進入這個格子。

?

示例 1:

輸入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"
輸出:true
示例 2:

輸入:board = [["a","b"],["c","d"]], word = "abcd"
輸出:false
提示:

1 <= board.length <= 200
1 <= board[i].length <= 200

dfs

/*
思路:
主方法:對每個點dfs
dfs方法:1、結束條件 2、記錄并做標記 3、嘗試周圍 4、回溯,恢復原樣 5、返回值
*/
class Solution {char[] words;char[][] board;public boolean exist(char[][] board, String word) {this.board=board;words = word.toCharArray();for(int i = 0; i < board.length; i++) {for(int j = 0; j < board[0].length; j++) {if(dfs(i, j, 0)) return true;}}return false;}boolean dfs(int i, int j, int k) {if(i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] != words[k]) return false;if(k == words.length - 1) return true;char tmp = board[i][j];board[i][j] = '/';boolean res = dfs(i + 1, j, k + 1) || dfs(i - 1, j, k + 1) || dfs(i, j + 1, k + 1) || dfs(i , j - 1, k + 1);board[i][j] = tmp;return res;}
}

給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段(m、n都是整數,n>1并且m>1),每段繩子的長度記為 k[0],k[1]...k[m] 。請問 k[0]*k[1]*...*k[m] 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18。

示例 1:

輸入: 2
輸出: 1
解釋: 2 = 1 + 1, 1 × 1 = 1
示例?2:

輸入: 10
輸出: 36
解釋: 10 = 3 + 3 + 4, 3 ×?3 ×?4 = 36
提示:

2 <= n <= 58

leetcode343. 整數拆分

class Solution {public int cuttingRope(int n) {int[] dp = new int[n + 1];dp[1]=1;for (int i = 2; i <= n; i++)for (int j = 1; j < i; j++)dp[i] = Math.max(dp[i], Math.max(j,dp[j]) * (i - j));return dp[n];}
}

給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段(m、n都是整數,n>1并且m>1),每段繩子的長度記為 k[0],k[1]...k[m] 。請問 k[0]*k[1]*...*k[m] 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18。

答案需要取模 1e9+7(1000000007),如計算初始結果為:1000000008,請返回 1。

?

示例 1:

輸入: 2
輸出: 1
解釋: 2 = 1 + 1, 1 × 1 = 1
示例?2:

輸入: 10
輸出: 36
解釋: 10 = 3 + 3 + 4, 3 ×?3 ×?4 = 36
?

提示:

2 <= n <= 1000

思路:

和上一題的區別的數范圍很大。

動態規劃不好比較大小,因為會取模。

如果用大數類,太麻煩,而且失去意義。

我們首先考慮對于一段長n的繩子,我們可以切出的結果包含什么?

1會包含嗎? 不會,因為1 * (k - 1) < k, 只要把1和任何一個其他的片段組合在一起就有個更大的值
2可以
3可以
4可以嗎? 它拆成兩個2的效果和本身一樣,因此也不考慮
5以上可以嗎? 不可以,這些繩子必須拆,因為總有一種拆法比不拆更優,比如拆成 k / 2 和 k - k / 2

綜上, 最后的結果只包含2和3(當然當總長度為2和3時單獨處理), 那么很顯然n >= 5時, 3*(n - 3) >= 2 * (n - 2) ,因此我們優先拆成3,最后剩余的拆成2。最后的結果一定是由若干個3和1或2個2組成.

class Solution {public int cuttingRope(int n) {if(n == 2) {return 1;}if(n == 3){return 2;}int mod = (int)1e9 + 7;long res = 1;while(n > 4) {res *= 3;res %= mod;n -= 3;}return (int)(res * n % mod);}
}

請實現一個函數,輸入一個整數,輸出該數二進制表示中 1 的個數。例如,把 9?表示成二進制是 1001,有 2 位是 1。因此,如果輸入 9,則該函數輸出 2。

示例 1:

輸入:00000000000000000000000000001011
輸出:3
解釋:輸入的二進制串 00000000000000000000000000001011?中,共有三位為 '1'。
示例 2:

輸入:00000000000000000000000010000000
輸出:1
解釋:輸入的二進制串 00000000000000000000000010000000?中,共有一位為 '1'。
示例 3:

輸入:11111111111111111111111111111101
輸出:31
解釋:輸入的二進制串 11111111111111111111111111111101 中,共有 31 位為 '1'。

思路:對每一位判斷即可。

public class Solution {public int hammingWeight(int n) {int res = 0;while(n != 0) {res += n & 1;n >>>= 1;}return res;}
}

實現函數double Power(double base, int exponent),求base的exponent次方。不得使用庫函數,同時不需要考慮大數問題。

?

示例 1:

輸入: 2.00000, 10
輸出: 1024.00000
示例?2:

輸入: 2.10000, 3
輸出: 9.26100
示例?3:

輸入: 2.00000, -2
輸出: 0.25000
解釋: 2-2 = 1/22 = 1/4 = 0.25
?

說明:

-100.0 <?x?< 100.0
n?是 32 位有符號整數,其數值范圍是?[?231,?231?? 1] 。

快速冪

temp是每一位是多少,ans是答案。(注意都是冪關系,全是乘)

class Solution {public double myPow(double x, int n) {if (n < 0) {x = 1 / x;n = -n;}double ans=1;double temp=x;while(n != 0) {if((n & 1) == 1)ans*=temp;n >>>= 1;temp*=temp;}return ans;}
}

輸入數字 n,按順序打印出從 1 到最大的 n 位十進制數。比如輸入 3,則打印出 1、2、3 一直到最大的 3 位數 999。

示例 1:

輸入: n = 1
輸出: [1,2,3,4,5,6,7,8,9]
?

說明:

用返回一個整數列表來代替打印
n 為正整數

估計是想考大數呢。但是無腦直接過了。

class Solution {public int[] printNumbers(int n) {int  sum = (int)Math.pow(10,n);int[] num = new int[sum-1];for(int i=0;i<sum-1;i++){num[i] = i+1;}return num;}
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444135.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444135.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444135.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

劍指offer:18-21記錄

給定單向鏈表的頭指針和一個要刪除的節點的值&#xff0c;定義一個函數刪除該節點。 返回刪除后的鏈表的頭節點。 注意&#xff1a;此題對比原題有改動 示例 1: 輸入: head [4,5,1,9], val 5 輸出: [4,1,9] 解釋: 給定你鏈表中值為 5 的第二個節點&#xff0c;那么在調用…

尚硅谷李老師筆記2

一&#xff1a;MySQL的背景 前身是瑞典的一家公司&#xff0c;MySQLAB 08年被sun公司收購 09年sun公司被oracle公司收購 二&#xff1a;MySQL的優點 1.開源&#xff0c;免費&#xff0c;成本低 2.性能高&#xff0c;移植性好 3.體積小&#xff0c;便于安裝 三&#xff1a;MyS…

劍指offer:22-25記錄

輸入一個鏈表&#xff0c;輸出該鏈表中倒數第k個節點。為了符合大多數人的習慣&#xff0c;本題從1開始計數&#xff0c;即鏈表的尾節點是倒數第1個節點。例如&#xff0c;一個鏈表有6個節點&#xff0c;從頭節點開始&#xff0c;它們的值依次是1、2、3、4、5、6。這個鏈表的倒…

尚硅谷李老師筆記3DQL

一&#xff1a;語法 select 查詢列表 from 表名 二&#xff1a;特點 1.查詢列表可以是字段&#xff0c;常量&#xff0c;表達式&#xff0c;函數&#xff0c;也可以是多個的組合結果 2.查詢結果是一張虛擬表 三&#xff1a;示例 1.查詢單個字段 select 字段名 from 表名 2.查…

java 防止表單重復提交

防止表單重復提交&#xff0c;或者是防止按F5 刷新提交表單。 在WEB開發中是經常會碰到這樣的問題的。 目前主流的解決方法有以下三種&#xff1a; 1、采用腳本來解決 2、重定向到別的頁面 3、使用s:token 標簽 由于我是使用S2SH來開發的&#xff0c;所以就選擇了第三種方法。 …

貪吃蛇源代碼111

#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> #include <time.h> const int H 8; //地圖的高 const int L 16; //地圖的長 char GameMap[H][L]; //游戲地圖 int key; //按鍵保存 int sum 1, over 0; //蛇…

劍指offer:26-30記錄

輸入兩棵二叉樹A和B&#xff0c;判斷B是不是A的子結構。(約定空樹不是任意一個樹的子結構) B是A的子結構&#xff0c; 即 A中有出現和B相同的結構和節點值。 例如: 給定的樹 A: 3 / \ 4 5 / \ 1 2 給定的樹 B&#xff1a; 4 / 1 返回 true&#xff0c;因為…

Calendar類 set方法 get方法 add方法

Calendar類 set方法 get方法 add方法 package asd; import java.util.*; public class zixue { public static void main(String[] args) { demo01();//實驗的是get()方法&#xff1b; demo02();//實驗的是set()方法&#xff1b; } //---------------------------------------…

劍指offer:31-32記錄(4道)

輸入兩個整數序列&#xff0c;第一個序列表示棧的壓入順序&#xff0c;請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如&#xff0c;序列 {1,2,3,4,5} 是某棧的壓棧序列&#xff0c;序列 {4,5,3,2,1} 是該壓棧序列對應的一個彈出序列&#xff0c;但…

炸窩Vector簡介

/** 1.Vector的介紹&#xff1a;* Vector<E>是所有單列集合的鼻祖&#xff0c;但是在JAVA1.2版本之后就被Collection集合所替代&#xff0c;Vector可以實現可增長的對象數組* 與數組一樣&#xff0c;它包含可以使用整數索引進行訪問的組件* 但是它的大小可以根據需要增加…

劍指offer:33-37記錄

輸入一個整數數組&#xff0c;判斷該數組是不是某二叉搜索樹的后序遍歷結果。如果是則返回 true&#xff0c;否則返回 false。假設輸入的數組的任意兩個數字都互不相同。 參考以下這顆二叉搜索樹&#xff1a; 5 / \ 2 6 / \ 1 3 示例 1&#xff1a; 輸入: [1,6,…

劍指offer:39-42記錄

數組中有一個數字出現的次數超過數組長度的一半&#xff0c;請找出這個數字。 你可以假設數組是非空的&#xff0c;并且給定的數組總是存在多數元素。 示例 1: 輸入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 輸出: 2 限制&#xff1a; 1 < 數組長度 < 50000 思路&#xff1a;…

炸窩哈希值的原理

package asdfg; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class aaa { public static void main(String[] args) {/*** 小提示&#xff1a;* 1.對于所有沒有索引的方法&#xff0c;我們都不能使用for循環進行遍歷* 2.提到接口&am…

劍指offer:45-48記錄

輸入一個正整數數組&#xff0c;把數組里所有數字拼接起來排成一個數&#xff0c;打印能拼接出的所有數字中最小的一個。 示例 1: 輸入: [10,2] 輸出: "102" 示例 2: 輸入: [3,30,34,5,9] 輸出: "3033459" 提示: 0 < nums.length < 100 說明:…

炸窩(可變函數)

可變函數源碼理解&#xff1a;學生角度&#xff0c;更易操作 public static void main(String[] args) {/*int cadd(10,29);System.out.println(c);*///此時可以隨意的進行數據的傳遞add(20,30,40);//[I1db9742:解釋&#xff0c;中括號代表是一個數組&#xff0c;為一個地址值…

劍指offer:50-53記錄

在字符串 s 中找出第一個只出現一次的字符。如果沒有&#xff0c;返回一個單空格。 示例: s "abaccdeff" 返回 "b" s "" 返回 " " 限制&#xff1a; 0 < s 的長度 < 50000 思路&#xff1a;map記錄次數&#xff0c;再…

Eclipse安裝插件的幾種方式

前段時間Google轉向了IDEA&#xff0c;貌似有些動搖了Eclipse作為Java領域IDE龍頭老大的位置&#xff0c;為此引起了Eclipse粉絲和IDEA粉絲的集體罵戰。類似這種罵戰向來都不絕于耳&#xff0c;貌似程序員的都比較多&#xff0c;可能大家都是搞技術出身&#xff0c;都很自信。其…

炸窩(Collections當中的addAll方法)

public class aaa { public static void main(String[] args) {/** java.util.Collections是集合工具類&#xff0c;用來對集合進行操作&#xff0c;* * 集合Collections當中的兩個方法&#xff1a;* 1.addAll方法&#xff1a;因為是靜態方法&#xff0c;嗯所以可以.直接吹風機…

劍指offer:55-58記錄

輸入一棵二叉樹的根節點&#xff0c;求該樹的深度。從根節點到葉節點依次經過的節點&#xff08;含根、葉節點&#xff09;形成樹的一條路徑&#xff0c;最長路徑的長度為樹的深度。 例如&#xff1a; 給定二叉樹 [3,9,20,null,null,15,7]&#xff0c; 3 / \ 9 20 …

Map集合知識點(炸窩)

/** * 簡單的介紹一下我們接下來準備學習的集合MAP集合 * * Map集合的簡單概述&#xff1a; * 其中的健是不能進行重復的&#xff0c;而且每一健只能映射一個值&#xff0c;簡單的說就是K與V是一一對應的&#xff0c;不能有其他的關系&#xff0c; * 但是我們注意到value值是可…