ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

DeepSeek LeetCode 402. 移掉 K 位数字 Java实现

DeepSeek    LeetCode 402. 移掉 K 位数字 Java实现 LeetCode 402. 移掉 K 位数字思路单调栈贪心 栈要让剩下的数字最小高位数字越小越好。因此从左到右扫描只要当前数字比栈顶小且还有移除次数就弹出栈顶因为高位更小收益更大。核心步骤维护一个单调递增栈栈底到栈顶递增遍历每个数字若 栈顶 当前数字 且 k 0弹栈并 k–遍历结束后若 k 0说明序列本身是递增的从末尾删除剩余的 k 个去掉结果中的前导零若为空返回 “0”Java 实现classSolution{publicStringremoveKdigits(Stringnum,intk){DequeCharacterstacknewArrayDeque();for(charc:num.toCharArray()){// 当前数字更小且还有移除次数则弹出栈顶while(k0!stack.isEmpty()stack.peek()c){stack.pop();k--;}stack.push(c);}// 若 k 还有剩余说明原序列单调递增从末尾移除while(k0!stack.isEmpty()){stack.pop();k--;}// 从栈底到栈顶拼接结果StringBuildersbnewStringBuilder();while(!stack.isEmpty()){sb.append(stack.pollLast());}// 去除前导零inti0;while(isb.length()sb.charAt(i)0){i;}Stringressb.substring(i);returnres.isEmpty()?0:res;}}复杂度· 时间O(n)每个字符最多入栈、出栈各一次· 空间O(n)栈空间测试样例SolutionsnewSolution();System.out.println(s.removeKdigits(1432219,3));// 1219System.out.println(s.removeKdigits(10200,1));// 200System.out.println(s.removeKdigits(10,2));// 0System.out.println(s.removeKdigits(9,1));// 0System.out.println(s.removeKdigits(112,1));// 11递增序列删除末尾关键点易错点 说明剩余 k 的处理 若输入递增如 “1234”栈不会被弹出需从末尾删除前导零 如 “10200” 删除 1 后得到 “0200”需转为 “200”结果为空的处理 全部删除后返回 “0”用 ArrayDeque 比 Stack 更快pollLast 可正向构造结果
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表