1. 程式人生 > >leetcode 402 Remove K Digits(移除k個數字 貪心)

leetcode 402 Remove K Digits(移除k個數字 貪心)

分析和思路:

就是說給一個字串形式的正數,刪除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直接輸出。

加油,現在只是貪心而已,還沒有動態規劃呢

穩住,我們能贏