leetcode 402 Remove K Digits(移除k個數字 貪心)
阿新 • • 發佈:2018-12-04
分析和思路:
就是說給一個字串形式的正數,刪除k個數字,使得字串數字最小
貪心思路
那麼就是每次刪除一個數,每次保證高位最小。
java程式碼:
class Solution { public String removeKdigits(String num, int k) { if(k>=num.length()) return "0"; for(int i=0;i<k;i++){ num=removeOnedigit(num); } //數字中有0出現 int i=0; int length=num.length(); while(i<length-1 &&num.charAt(i)=='0'){ i++; } return num.substring(i); } String removeOnedigit(String str){ int length= str.length(); for(int i=0;i<length-1;i++){ if(str.charAt(i)>str.charAt(i+1)) return str.substring(0,i)+str.substring(i+1);//刪掉i位置的字元 } //如果一直是單調遞增 return str.substring(0,length-1);//每次刪掉末尾的數 } }
如上,程式碼中時間我好像是83ms,只超過了9%的人,所以肯定有更快的做法,也許不呼叫函式直接寫一個裡面試試
開頭一個if迴圈,判斷k和字串長度的關係,如果相等,直接返回0(因為全部刪了,其實不用判斷k>length也行,因為題上說預設k不會大於num字串的長度,其實只用判斷相等就行了)
然後刪除k個數字,一個迴圈k次,每次呼叫removeOnedigit()
然後在removeOnedigit裡面,遍歷str字串(也就是當前num字串),如果遇到前一個字元大於後面一個字元,就把前面這個字元刪掉,然後返回最新字串(這個返回不是最終返回哦)
str.substring(0,i)+str.substring(i+1)
注意java的str.substring(i)是 取str從i位置到最後的子字串(字串從0位置開始)
str.substring(i,j)是取str從i位置到j-1位置的子字串
如果迴圈到最後結束都沒有返回,說明字串內部數字是單調遞增的,這樣每次刪掉最後一個數字就可以了(遞增當然說明最後的數最大啦)
如果刪除之後,字串內前面有0存在,比如 20200,k=1,刪除之後是0200
這個時候再加入一個while迴圈看有幾個0,因為我們輸出的有效數字是從第一位不是0的數開始的嘛,刪掉這幾個0就可以了,然後返回子串
注意,removeKdigits()中最後的返回值,才是最終我們輸出的返回值,而且這個時候如果i=0說明num前面沒有0,那麼substing(0)就是num直接輸出。
加油,現在只是貪心而已,還沒有動態規劃呢
穩住,我們能贏