程序员老鬼

网友吐槽:来了个新员工,我把最难解决BUG丢给他,没想到他下班前就搞定了~

你们有没有遇到过这种情况:新来的同事比你还牛逼?我最近就看到了这么一幕。

网友吐槽:我们团队最近迎来了一位新员工,他有两年工作经验,刚入职不久。因为我们有个bug一直卡住了,代码里的一些复杂逻辑让我头大,想着这个bug估计要拖到加班才能解决了。
于是,我就心思一动,把这个最棘手的问题丢给了他,心里想着:“小伙子,你就先熟悉熟悉代码,顺便搞定这个bug,今天必须完成。”
Image
结果,没想到这小子居然搞定了!而且代码简洁明了,问题解决得非常彻底。😱
一开始也没太在意,觉得自己只是让新员工解决个bug,毕竟他只是个“试水”阶段的小同事,谁知道他这么给力!现在想想,网友说得挺对的:我得赶紧跟他搞好关系,给他点福利,不然真怕被甩到一边去,最后啥也没捞着。
Image
不过,想想也是,如果能双赢,那不就太爽了吗?我给他提供点便利,他帮我提高业绩,大家互帮互助,那效率杠杠的!

算法题:移掉 K 位数字

今天给大家带来一个经典的算法题:移掉 K 位数字。听上去简单,但真正动起来有点意思。作为程序员的我们,常常会遇到需要处理字符串和数字的情况,而这个题目就很好地将这两者结合了起来。
首先,题目要求我们从一个给定的数字串中移掉 K 位数字,使得剩下的数字是最小的。那问题来了,怎么能移掉 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;
}

代码解释:
  1. 我们首先用一个栈来保存数字。
  2. 在遍历每一个数字时,如果当前数字比栈顶元素小,我们就将栈顶元素弹出,这样就能够保证栈中的数字是递增的。
  3. 每次弹出栈顶元素时,k值会减一,表示我们已经移掉了一位数字。
  4. 遍历完成后,如果还有剩余的 k(说明数字串的最后部分有多余的数字),就从栈中继续弹出。
  5. 最后,我们需要移除结果中的前导零,这步很重要,不然“0000”就成了结果。处理完毕后,如果结果为空,就返回 "0"。
时间复杂度分析:时间复杂度是 O(n),其中 n 是数字串的长度。每个数字最多只会入栈一次,出栈一次,所以栈的操作总数是 O(n)。因此,整个算法的时间复杂度是 O(n)。
空间复杂度分析:空间复杂度是 O(n),我们用一个栈来保存数字,最多保存 n 个数字。
讲个段子:说到栈啊,我记得有个程序员朋友总是抱怨:“我找不到对象了,要不要给我的爱情也来个栈结构呢?每次感情复杂,后进先出,岂不是能避免感情上的浪费?” 😂
说真的,栈结构就是这么“实用”,不仅解决了我们算法中的问题,也让我们在生活中琢磨了不少。希望这道题给你带来一些思路,也希望你能享受解决问题的过程。

-END-

ok,今天先说到这,老规矩,给大家分享一份不错的副业资料,感兴趣的同学找我领取。

Image

以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言。