LeetCode 402. Remove K Digits

原题链接在这里:https://leetcode.com/problems/remove-k-digits/description/

题目:

Given a non-negative integer num represented as a string, remove k digits from the number so that the new number is the smallest possible.

Note:

  • The length of num is less than 10002 and will be ≥ k.
  • The given num does not contain any leading zero. 

Example 1:

Input: num = "1432219", k = 3
Output: "1219"
Explanation: Remove the three digits 4, 3, and 2 to form the new number 1219 which is the smallest.

Example 2:

Input: num = "10200", k = 1
Output: "200"
Explanation: Remove the leading 1 and the number is 200. Note that the output must not contain leading zeroes.

Example 3:

Input: num = "10", k = 2
Output: "0"
Explanation: Remove all the digits from the number and it is left with nothing which is 0.

题解:

利用stack保存从头到尾iterate input num string的char, if current char c < stack top, then一直pop栈顶 unitl 去掉的数等于k了或者栈顶的元素更小.

然后从头到尾找到第一个非0的位置 往后扫剩余digit长度的char. 

扫过的0也应该count在剩余digit长度中,只不过不会显示在结果string里.

Time Complexity: O(n). n = num.length().

Space: O(n).

AC Java:

 1 class Solution {
 2     public String removeKdigits(String num, int k) {
 3         if(num == null || num.length() == 0){
 4             return num;
 5         }
 6         
 7         int len = num.length();
 8         int remainDigits = len-k;
 9         char [] stk = new char[len];
10         int top = 0;
11         for(int i = 0; i<len; i++){
12             char c = num.charAt(i);
13             while(top>0 && c<stk[top-1] && k>0){
14                 top--;
15                 k--;
16             }
17             
18             stk[top++] = c;
19         }
20         
21         // 找到第一个不为0的index
22         int ind = 0;
23         while(ind<remainDigits && stk[ind]=='0'){
24             ind++;
25         }
26         return ind == remainDigits ? "0" : new String(stk, ind, remainDigits-ind);
27     }
28 }

类似Create Maximum NumberMaximum Swap.

原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/8327380.html