给定一个以字符串表示的数字 num 和一个数字 k ,从 num 中移除 k 位数字,使得剩下的数字最小。如果可以删除全部数字,则结果为 0。
1.num仅有数字组成
2.num是合法的数字,不含前导0
3.删除之后的num,请去掉前导0(不算在移除次数中)
数据范围:num的长度满足
,保证 num 中仅包含 0~9 的十进制数
"1432219",3
"1219"
移除 4 3 2 后剩下 1219
"10",1
"0"
"100999",3
"9"
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num string字符串 * @param k int整型 * @return string字符串 */ public String removeKnums (String num, int k) { // write code here Stack<Integer> stack = new Stack<>(); for(int i = 0; i < num.length(); i++){ int digit = num.charAt(i) - '0'; while(!stack.isEmpty() && stack.peek() > digit && k > 0){ stack.pop(); k--; } stack.push(digit); } while(k > 0 && !stack.isEmpty()){ stack.pop(); k--; } // 去掉前导0 StringBuilder res = new StringBuilder(); Stack<Integer> resStack = new Stack<>(); while(!stack.isEmpty()){ resStack.push(stack.pop()); } while(!resStack.isEmpty() && resStack.peek() == 0){ resStack.pop(); } while(!resStack.isEmpty()){ res.append(resStack.pop()); } // 所有字符都移除干净了就返回0 return res.length() > 0? res.toString(): "0"; } }
public static String removeKnums(String num, int k) { if (k >= num.length()) return "0"; LinkedList<Character> queue = new LinkedList<>(); for (int i = 0; i < num.length(); i++) { while (!queue.isEmpty() && queue.peekFirst() == '0') queue.pollFirst(); while (!queue.isEmpty() && k > 0 && num.charAt(i) <= queue.peekLast()) { queue.pollLast(); k--; } queue.offer(num.charAt(i)); } if (k != 0) return num.substring(0, num.length() - k); StringBuilder sb = new StringBuilder(); while (!queue.isEmpty()) sb.append(queue.pop()); return sb.length() == 0 ? "0" : sb.toString(); } }
import java.util.*; public class Solution { public String removeKnums (String num, int k) { if (k >= num.length()) return "0"; ArrayDeque<Character> stack = new ArrayDeque<>(); for (char c : num.toCharArray()) { while (k > 0 && !stack.isEmpty() && c < stack.peek()) { stack.pop(); k--; } stack.push(c); } StringBuilder res = new StringBuilder(); while (!stack.isEmpty()) { res.insert(0, stack.pop()); } // 去除前导0!!! int i = 0; while (i < res.length()) { if (res.charAt(i) == '0') i++; else break; } if (i > 0 && res.length() > 1) return res.delete(0, i).toString(); else return res.toString(); } }
import java.util.*; /** * NC219 移掉 K 位数字 * @author d3y1 */ public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num string字符串 * @param k int整型 * @return string字符串 */ public String removeKnums (String num, int k) { // return solution1(num, k); // return solution2(num, k); return solution3(num, k); } /** * 单调栈+贪心 * @param num * @param k * @return */ private String solution1(String num, int k){ if(k >= num.length()){ return "0"; } Stack<Character> stack = new Stack<>(); for(char digit: num.toCharArray()){ // 单调栈(单调增) while(!stack.isEmpty() && digit<stack.peek() && k>0){ // 贪心 stack.pop(); k--; } stack.push(digit); } // 继续移除 while(k-- > 0){ if(!stack.isEmpty()){ stack.pop(); } } // 保存结果 StringBuilder sb = new StringBuilder(); while(!stack.isEmpty()){ sb.insert(0, stack.pop()); } // 去掉前导0 String result = sb.toString(); if(result.startsWith("0")){ int index; for(index=0; index<result.length(); index++){ if(result.charAt(index) != '0'){ break; } } if(index < result.length()){ result = result.substring(index); }else{ result = "0"; } } return result; } /** * 单调栈+贪心 * @param num * @param k * @return */ private String solution2(String num, int k){ int n = num.length(); if(k >= n){ return "0"; } Deque<Character> stack = new ArrayDeque<>(); for(char ch: num.toCharArray()){ // 单调栈(单调增) while(!stack.isEmpty() && stack.peekLast()>ch && k>0){ // 贪心 stack.pollLast(); k--; } stack.offerLast(ch); } // 继续移除 while(!stack.isEmpty() && k>0){ stack.pollLast(); k--; } // 去掉前导0 while(!stack.isEmpty() && stack.peekFirst()=='0'){ stack.pollFirst(); } // 保存结果 StringBuilder sb = new StringBuilder(); while(!stack.isEmpty()){ sb.append(stack.pollFirst()); } return sb.length()==0?"0":sb.toString(); } /** * 单调栈+贪心 * @param num * @param k * @return */ private String solution3(String num, int k){ int n = num.length(); if(k >= n){ return "0"; } Deque<Character> stack = new ArrayDeque<>(); for(char ch: num.toCharArray()){ // 单调栈(单调增) while(!stack.isEmpty() && stack.peekLast()>ch && k>0){ // 贪心 stack.pollLast(); k--; } stack.offerLast(ch); } // 继续移除 while(!stack.isEmpty() && k>0){ stack.pollLast(); k--; } // 保存结果 StringBuilder sb = new StringBuilder(); while(!stack.isEmpty()){ sb.append(stack.pollFirst()); } // 去掉前导0 String result = sb.toString().replaceFirst("^0+", ""); return "".equals(result)?"0":result; } }
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num string字符串 * @param k int整型 * @return string字符串 */ string removeKnums(string s, int k) { int n = s.length(); int m = n - k; //选取m个数 if(k>=n) return "0"; vector<int> v(n, 0); vector<int> c(m, 0); for (int i = 0; i < n; i++) { v[i] = s[i] - '0'; } int idx = -1; for (int i = 0; i < m; i++) { int min = INT_MAX; for (int j = idx + 1; j < n; j++) { int remain = m-i-1; if ((v[j] < min) && (n - j - 1 >= remain)) { min = v[j]; idx = j; } } c[i] = min; } string res; idx = 0; while (idx<m && c[idx] == 0) idx++; if(idx==m) return "0"; for (int i = idx; i < m; i++) { res.push_back(c[i] + '0'); } return res; } };
#include <string> #include <vector> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num string字符串 * @param k int整型 * @return string字符串 */ string removeKnums(string num, int k) { if (k == 0) return num; vector<char> v; v.reserve(num.size()); int s = 0; for (auto ch : num) { while (!v.empty() && s < k && ch < v.back()) { v.pop_back(); s++; } v.emplace_back(ch); } if (s < k) { v.erase(v.begin() + (v.size() - k + s), v.end()); } int index = 0; for (; index < v.size(); index++) { if (v[index] != '0') break; } v.erase(v.begin(), v.begin() + index); v.emplace_back(0); return v[0] == 0 ? "0" : v.data(); } };
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num string字符串 * @param k int整型 * @return string字符串 */ string removeKnums(string num, int k) { // write code here stack<int> stk; int cur = 0; int cur_k = 0; while(cur < num.length()){ while(!stk.empty() && (num[cur]-'0') < stk.top() && cur_k < k){ stk.pop(); cur_k++; } stk.push(num[cur] - '0'); cur++; } while(cur_k < k){ stk.pop(); cur_k++; } string res = ""; while(!stk.empty()){ res.push_back(stk.top()+'0'); stk.pop(); } // 去除前导0 cur = res.length()-1; while(res[cur] == '0'){ res.pop_back(); cur--; } reverse(res.begin(), res.end()); return res == ""? "0":res; } };
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num string字符串 * @param k int整型 * @return string字符串 */ public String removeKnums (String num, int k) { if (k > num.length()) return "0"; // write code here if (k == 0) { if (num.length() == 0){ return "0"; }else{ String m =num; while(m.charAt(0)=='0'){ m=m.replaceFirst("0",""); } return m; } } char[] chs = num.toCharArray(); int tartgetPosition = 0; int i= 1; for (; i < chs.length; i++) { int a = chs[i - 1] - '0'; int b = chs[i] - '0'; if (a>b){ tartgetPosition=i-1; break; } } if (i==chs.length){ tartgetPosition= chs.length-1; } char c = chs[tartgetPosition]; String s2 = num.replaceFirst("" + c, ""); k--; return removeKnums(s2, k); } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param num string字符串 * @param k int整型 * @return string字符串 */ public String removeKnums (String num, int k) { // write code here Stack<Integer> stack = new Stack(); for(int i = 0;i < num.length();i++){ int digit = num.charAt(i)-'0'; while(k > 0 && !stack.isEmpty() && digit < stack.peek()){ stack.pop(); k--; } stack.push(digit); } while(k > 0 && !stack.isEmpty()){ stack.pop(); k--; } StringBuffer res = new StringBuffer(); while (!stack.isEmpty()){ res.append(stack.pop()); } //trim leading zero while (res.length() > 0 && res.charAt(res.length()-1) == '0'){ res.deleteCharAt(res.length()-1); } return res.length() == 0 ? "0" : res.reverse().toString(); } } /* 思路:利用单调栈特性,遍历字符串的每一位,如果当前数字大于前面的 的数字,就将该数出栈,需要出栈的个数减一,反之进栈; 若遍历完一次,k的值还大于0,证明出栈次数还不够,进行出栈操作,k次数减一; 新建一个stringbuffer往里面添加元素; 当字符串的最后一位是0,则删除最后一位0,然后返回结果 结果如果得出移除后的长度为0则为0,不为0则将数字进行反转后输出 */
class Solution: def removeKnums(self , num: str, k: int) -> str: # write code here if len(num) == k: return 0 stack = [] for i in range(len(num)): while stack and ord(num[i]) < ord(stack[-1]) and k: k -= 1 stack.pop() stack.append(num[i]) res = "" for i in range(len(stack)): if stack[i] != "0": res = "".join(stack[i:]) break return int(res) if len(res) != 0 else 0