402. 移掉K位數字 (按位考慮 貪心)

lankerenx發表於2020-11-15

LeetCode: 402. 移掉K位數字

在這裡插入圖片描述


題目大意: 移掉 k 個數 >> 使得這個數最小 ( 不能有前導 0 )

貪心題 >> 看到題面 >> 沒有思路



貪心思路:
按位考慮,考慮第一位能不能通過刪數得到1,不能就是2,找到第一位能得到的最小值,把前面全部刪掉, 第二位也是一樣

還有考慮 0



貪心程式碼


    public String removeKdigits(String num, int k) {
        if (num.length() == k) return "0";
        StringBuffer sb = new StringBuffer();
        // boolean b = true;
        int start = 0, len = num.length() - k;
        while (k > 0) {
            if(sb.length() == len) break ;
            boolean f = false;
            for (int j = 0; j <= 9; j++) {
                // 找 0 ~ 9
                // 第一位不能要 0
//                if(b) { b = false; continue ; }

                // 按位考慮
                for (int i = start; i < num.length(); i++) {
                    if(i - start > k) break ;
                    if(num.charAt(i) - '0' == j){
                        sb.append(num.charAt(i) - '0');
                        // k >> skip 刪除當前的幾個
                        k -= (i - start);
                        start = i + 1;
                        f = true;
                        // 如果不夠減
                        break ;
                    }
                }

                if (f) break;
            }
        }
        // 1112219  >> k = 3  的情況, sb 取到 1111 答案了, k 還是 3 (沒必要繼續迴圈了)
        if(sb.length() != len) sb.append(num.substring(start)); 

        int cnt = 0;
        while (cnt < sb.length() - 1 && sb.charAt(cnt) == '0'){
            cnt++;
        }
        
        return sb.substring(cnt);
    }


在這裡插入圖片描述



相關文章