网友吐槽:来了个新员工,我把最难解决BUG丢给他,没想到他下班前就搞定了~
你们有没有遇到过这种情况:新来的同事比你还牛逼?我最近就看到了这么一幕。
算法题:移掉 K 位数字
n,要移掉 K 位数字,我们最终留下的应该是一个 n-k 长度的数字。听起来好像是一个典型的贪心算法问题吧?没错,这确实是一个贪心算法题。public String removeKdigits(String num, int k) {
// 特殊情况处理:如果k等于数字的长度,直接返回0
if (num.length() == k) return "0";// 创建一个栈,用于存放数字
Stack<Character> stack = new Stack<>();// 遍历每个数字
for (char digit : num.toCharArray()) {
// 如果栈不为空且当前数字小于栈顶元素,弹出栈顶元素
while (k > 0 && !stack.isEmpty() && stack.peek() > digit) {
stack.pop();
k--;
}
// 将当前数字加入栈
stack.push(digit);
}// 如果还有剩余的k,说明末尾的数字要移除
while (k > 0) {
stack.pop();
k--;
}// 构建最终结果
StringBuilder result = new StringBuilder();
for (char digit : stack) {
result.append(digit);
}// 去除前导零
String resultStr = result.toString().replaceFirst("^0+(?!$)", "");// 如果去掉前导零后结果为空,则返回0
return resultStr.isEmpty() ? "0" : resultStr;
}
我们首先用一个栈来保存数字。 在遍历每一个数字时,如果当前数字比栈顶元素小,我们就将栈顶元素弹出,这样就能够保证栈中的数字是递增的。 每次弹出栈顶元素时,k值会减一,表示我们已经移掉了一位数字。 遍历完成后,如果还有剩余的 k(说明数字串的最后部分有多余的数字),就从栈中继续弹出。 最后,我们需要移除结果中的前导零,这步很重要,不然“0000”就成了结果。处理完毕后,如果结果为空,就返回 "0"。
-END-
以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言。