一個足夠大的數字,刪去k個數字後得到最小值
阿新 • • 發佈:2018-12-01
直接上程式碼了
/** * 刪除整數的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)。