程序员老鬼

我工资10000,面试下家说能涨到15000,我去跟领导说,他给我涨到16000。结果几天后,下家HR找我说20000立刻就签

作为一名程序员,我看到了这个帖子,心里不禁感慨。

Image

很多人可能会觉得这就是一个简单的薪资谈判过程,但从程序员的角度来看,这里面隐藏的背后是更深层次的职业规划和市场竞争。

首先,薪资涨幅背后其实是对自己能力的认可。当你能通过面试得到更高的薪资,说明你在技术和经验上有一定的积累。

而且在IT行业,尤其是程序员这一职业,薪资涨幅的差异也反映了公司对技术能力的重视程度。像这个例子,领导的加薪只是表面上的回应,更大的可能是公司对你个人价值的再评估。

每一份工作都是一次成长的机会,我们应该更多关注职业发展的方向,而不是短期的薪资数字。

长期来看,积累经验、提升技术水平,才能真正带来更可持续的职业发展和薪资增长。

如果你也面临类似的选择,不妨好好思考一下自己的职业路径,选择一个不仅能给你提供薪水的公司,更能帮助你成长的团队。【备注:文末可领最新资料】。

算法题:找出最长的超赞子字符串

最近我在做一些算法题的时候,遇到一个挺有意思的问题:找出一个字符串中最长的超赞子字符串。说白了,就是给你一个字符串,你得找到一个字母重复次数不超过两个的子字符串。听起来好像很简单,但要在性能和效率上做到优雅,那就有点挑战性了。

我们先从题目给的要求开始分析:假设字符串是“abcdeabbcd”,其中我们需要找到最长的连续子字符串,且该子字符串中的字符最多重复两次。比如,对于这个字符串,“abcaabb”就符合这个要求,因为它最长且只有‘a’和‘b’重复。好,那我们该如何来做呢?

要解决这个问题,我们需要考虑两点:一个是效率,另一个是如何判断一个子字符串是否符合“超赞”的条件。

滑动窗口算法

这个问题最经典的解法就是滑动窗口(Sliding Window)算法,简直是解决字符串相关问题的神器。我们可以通过两个指针,维护一个“窗口”来遍历字符串,然后逐步调整窗口的大小,确保窗口内的字符重复次数不超过两个。具体实现可以是:

import java.util.HashMap;

public class Solution {
    public String longestNiceSubstring(String s) {
        int left = 0, right = 0;
        int maxLength = 0;
        String maxSubstr = "";
        HashMap<Character, Integer> charCount = new HashMap<>();

                while (right < s.length()) {
            // 加入新字符,增加其出现次数
            charCount.put(s.charAt(right), charCount.getOrDefault(s.charAt(right), 0) + 1);

                        // 检查窗口内的字符是否超出了限制
            while (charCount.get(s.charAt(right)) > 2) {
                // 如果超出,移动左指针,缩小窗口
                charCount.put(s.charAt(left), charCount.get(s.charAt(left)) - 1);
                left++;
            }

                        // 计算窗口长度并更新最大值
            if (right - left + 1 > maxLength) {
                maxLength = right - left + 1;
                maxSubstr = s.substring(left, right + 1);
            }

                        // 扩大右指针,继续扩展窗口
            right++;
        }

                return maxSubstr;
    }

        public static void main(String[] args) {
        Solution sol = new Solution();
        System.out.println(sol.longestNiceSubstring("abcdeabbcd"));  // 输出: "abcaabb"
    }
}

代码分析

  1. 滑动窗口:我们用两个指针 left 和 right 来维护一个窗口,left 用来表示当前窗口的左边界,right 表示窗口的右边界。每次扩展右边界时,我们就将窗口内的字符存入 HashMap 中,记录每个字符的出现次数。

  2. 缩小窗口:当窗口内某个字符的出现次数超过 2 时,我们就需要移动 left 指针来缩小窗口,直到窗口内所有字符的出现次数都不超过 2。

  3. 更新最大子串:每次右指针移动时,我们都会计算当前窗口的长度,如果这个长度比之前的最大子串还大,就更新最大子串。

为啥用 HashMap?

用 HashMap 来存储字符的计数是为了高效地查找每个字符出现的次数。可以想象,如果不使用 HashMap,你可能需要用嵌套的 for 循环来重新计算每次窗口的字符频率,时间复杂度就会变得很高。而 HashMap 能让你在常数时间内得到某个字符的计数。

算法复杂度分析

  • 时间复杂度:O(n),其中 n 是字符串的长度。因为我们只需要遍历字符串一次,每个字符最多被处理两次(一次在 right 指针上,另一次在 left 指针上)。因此时间复杂度是 O(n)。

  • 空间复杂度:O(k),其中 k 是窗口内不重复的字符数量。最坏情况下,如果字符串中每个字符都不重复,那么空间复杂度就是 O(k),k 最多为字符串的长度。

这个解法的妙处

说到这儿,很多人可能会觉得,这个算法是不是有点过于“机械化”?说实话,我最初也觉得这题会需要复杂的动态规划什么的,但滑动窗口的解法真的是又快又简洁。通过不断移动两个指针,就能高效地找到答案,避免了暴力算法中的低效计算。

而且,这个解法适应的场景非常广泛,很多字符串问题都可以通过滑动窗口来优化,基本上是性能优化的一大利器。

我觉得,能够通过高效的算法解决问题,是开发者最具成就感的时刻之一。毕竟,谁不想把一个问题“撕裂”了,然后拿出最优的解法呢?😎

最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek

Image

也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。

-END-

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

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