Lintcode:182. 刪除數字
阿新 • • 發佈:2018-11-04
描述
給出一個字串 A, 表示一個 n 位正整數, 刪除其中 k 位數字, 使得剩餘的數字仍然按照原來的順序排列產生一個新的正整數。
找到刪除 k 個數字之後的最小正整數。
N <= 240, k <= N
樣例
給出一個字串代表的正整數 A 和一個整數 k, 其中 A = 178542
, k = 4
返回一個字串 "12"
自己思路:採取的貪心策略如果前一個數大於後一個數,那麼就把大的數刪去,這樣剩下的就是最小整數
public String DeleteDigits(String A, int k) { int i = 1; StringBuilder sb = new StringBuilder(A); while (k > 0 && i < sb.length()){ if (sb.charAt(i-1) > sb.charAt(i) && sb.charAt(i-1) != '0'){ sb.replace(i-1,i,""); k--; i = 1; }else i++; } if (k > 0) sb.delete(sb.length()-k, sb.length()); while (sb.charAt(0) == '0'){ sb.deleteCharAt(0); } return sb.toString(); }
dalao思路:也是同樣思路,但dalao寫法更簡潔
public String DeleteDigits2(String A, int k) { // write your code here // use greedy algorithm // start from begining, delete k digits that is not in an increasing order if(A == null || A.length() == 0){ return "0"; } if(k <= 0){ return A; } StringBuilder sb = new StringBuilder(A); for(int i = 0; i < k; i++){ int j; for(j = 0; j < sb.length() - 1 && sb.charAt(j) <= sb.charAt(j + 1); j++){} sb.delete(j, j + 1); } // delete all prefix "0" while(sb.length() > 1 && sb.charAt(0) == '0'){ sb.delete(0, 1); } return sb.toString(); }
summary:把限制數目的k作為遍歷的硬指標,這樣就會簡潔很多