LeetCode 64最小路径和65有效数字66加一
原創公眾號:bigsai 專注于Java、數據結構與算法,一起進大廠不迷路!
關注后回復進群即可加入力扣打卡群,歡迎劃水。近期打卡:
LeetCode打卡 52八皇后Ⅱ&53最大子序和&54螺旋矩陣
LeetCode 55跳躍游戲&56合并區間&57插入區間
跟我打卡LeetCode 58最后一個單詞長度&59螺旋矩陣Ⅱ&60排列序列
跟我打卡LeetCode 61旋轉鏈表&62不同路徑&63不同路徑 II
最小路徑和
簡單的動態規劃,只能向右或者向下,所以可以使用動態規劃動態的找到最小路徑和,先對第一行和第一列特殊處理,然后順序遍歷數組的時候狀態轉移方程為:
dp[i][j]=Math.min(dp[i-1][j],dp[i][j-1])+grid[i][j];其中dp[i][j]意為第i行第j列的最小路徑和。
具體代碼為:
有效數字
驗證給定的字符串是否可以解釋為十進制數字。
例如:
"0" => true " 0.1 " => true "abc" => false "1 a" => false "2e10" => true " -90e3 " => true " 1e" => false "e3" => false " 6e-1" => true " 99e2.5 " => false "53.5e93" => true " --6 " => false "-+3" => false "95a54e53" => false說明: 我們有意將問題陳述地比較模糊。在實現代碼之前,你應當事先思考所有可能的情況。 這里給出一份可能存在于有效十進制數字中的字符列表:數字 0-9 指數 - "e" 正/負號 - "+"/"-" 小數點 - "." 當然,在輸入中,這些字符的上下文也很重要。更新于 2015-02-10:
C++函數的形式已經更新了。如果你仍然看見你的函數接收 const char * 類型的參數,請點擊重載按鈕重置你的代碼。
分析
這題其實挺麻煩的,我也是根據樣例不停的測試然后才最終得到正確的結果。這些數字和符號有一定的規律和要求。 我的分析就是將數字分成三塊 e前,e,e后。而每個數字可能是符號數字小數點等組成需要滿足一定規律。符號可以沒有,但是數字必須有! 具體可以參考這張圖:
實現代碼為:
public boolean isNumber(String s) {s=s.trim();char str[]=s.toCharArray();boolean smallpoint=false;//小數點boolean ise=false;//是否遇到eint localindex=0;//當前數字指標// 整體思路 左側部分 e 右側部分for(int i=0;i<str.length;i++){if(localindex==0&&(str[i]=='+'||str[i]=='-'))// + -號必須出現在前面 也就是localindex=0{if(smallpoint)return false; //小數點后不能有+- 例如0.+3continue;//否則繼續}else if (str[i]=='.') {if(smallpoint||ise)//當有小數點或者在e后面 不能3.12.5 也不能1e2.3return false;else {smallpoint=true;//否則將標記出現過小數點}}else if ((str[i]=='e'||str[i]=='E')&&localindex>0) {//遇到eif(ise)return false;//如果已經有e 那么返回false 不能 4e5eelse {smallpoint=false;//否則說明正常,開始統計e右側部分。e右側部分開始重新統計ise=true;//標記e已經出現localindex=0;//數字編號}}else if (str[i]>='0'&&str[i]<='9') {localindex++;}else {return false;}}if (localindex>0) {return true;}else return false;}還有這種方法就是有限狀態機(DFA)解決,具體解釋看題解吧:
圖片來源力扣題解
class Solution {public int make(char c) {switch(c) {case ' ': return 0;case '+':case '-': return 1;case '.': return 3;case 'e': return 4;default:if(c >= 48 && c <= 57) return 2;}return -1;}public boolean isNumber(String s) {int state = 0;int finals = 0b101101000;int[][] transfer = new int[][]{{ 0, 1, 6, 2,-1},{-1,-1, 6, 2,-1},{-1,-1, 3,-1,-1},{ 8,-1, 3,-1, 4},{-1, 7, 5,-1,-1},{ 8,-1, 5,-1,-1},{ 8,-1, 6, 3, 4},{-1,-1, 5,-1,-1},{ 8,-1,-1,-1,-1}};char[] ss = s.toCharArray();for(int i=0; i < ss.length; ++i) {int id = make(ss[i]);if (id < 0) return false;state = transfer[state][id];if (state < 0) return false;}return (finals & (1 << state)) > 0;} }作者:user8973 鏈接:https://leetcode-cn.com/problems/valid-number/solution/biao-qu-dong-fa-by-user8973/ 來源:力扣(LeetCode)加一
給定一個由 整數 組成的 非空 數組所表示的非負整數,在該數的基礎上加一。
最高位數字存放在數組的首位, 數組中每個元素只存儲單個數字。
你可以假設除了整數 0 之外,這個整數不會以零開頭。
示例 1:
輸入:digits = [1,2,3]
輸出:[1,2,4]
解釋:輸入數組表示數字 123。
示例 2:
輸入:digits = [4,3,2,1]
輸出:[4,3,2,2]
解釋:輸入數組表示數字 4321。
示例 3:
輸入:digits = [0]
輸出:[1]
提示:
1 <= digits.length <= 100
0 <= digits[i] <= 9
分析:簡單題,只需要本本分分模擬即可,將數組最后一位加一,如果產生進位一直向前判斷是否還需要進位。有一個需要注意的地方就是如果結束第0位也需要進位那么需要重新創建數組擴容賦值返回。
實現代碼:
class Solution {public int[] plusOne(int[] digits) {if(digits [digits.length-1]++==9)for(int i=digits.length-1;i>0;i--){digits[i]=0;if(++digits[i-1]!=10)break;}if(digits[0]==10){int value[]=new int[digits.length+1];digits[0]=0;value[0]=1;System.arraycopy(digits,0,value,1,digits.length);return value;}return digits;} }原創不易,bigsai請你幫兩件事幫忙一下:
點贊、在看、分享支持一下, 您的肯定是我創作的源源動力。
微信搜索「bigsai」,關注我的公眾號,不僅免費送你電子書,我還會第一時間在公眾號分享知識技術。加我還可拉你進力扣打卡群一起打卡LeetCode。
記得關注、咱們下次再見!
總結
以上是生活随笔為你收集整理的LeetCode 64最小路径和65有效数字66加一的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 「万字图文」史上最姨母级Java继承详解
- 下一篇: 「归纳|总结」程序员必知必会的十大排序算