1. 程式人生 > >一個足夠大的數字,刪去k個數字後得到最小值

一個足夠大的數字,刪去k個數字後得到最小值

直接上程式碼了

    /**
     *  刪除整數的k個數字,獲得刪除後的最小值
     * @param num 目標整數(用String做引數是因為考慮到num的值足夠大)
     * @param k 刪除數量
     * @return
     */
    public static String removeKDigits(String num,int k) {
        //新整數的最終長度 = 原整數長度 - k
        int newLength = num.length() - k;
        //建立一個棧 用於接收所有的數字
        char[] stack = new char[num.length()];
        int top = 0;
        for (int i = 0; i < num.length(); i++) {
            char c = num.charAt(i);
            //當棧頂數字大於遍歷到的當前數字,棧頂數字出棧(相當於刪除數字)
            while (top > 0 && stack[top - 1] > c && k > 0) {
                top -= 1;
                k -= 1;
            }
            //遍歷到的當前數字入棧
            stack[top++] = c;
        }
        // 找到棧中第一個非零數字的位置,以此構建新的整數字符串
        int offset = 0;
        while (offset < newLength && stack[offset] == '0') {
            offset++;
        }
        return offset == newLength ? "0" : new String(stack,offset,newLength - offset);
    }

此時棧中的元素就是最終的結果。

程式碼只對所有數字遍歷了一趟,遍歷的時間複雜度是O(n),而後把棧轉化為字串的時間複雜度也是O(n),所以最終的時間複雜度是O(n)

同時,程式中利用棧來回溯遍歷過的數字以及刪除數字,所以程式的空間複雜度是O(n)