程序员老鬼

x米员工爆料:35岁被裁后,投百份简历无人问津,一气之下把薪资由2W调为3W,简历改成英文,结果出乎意料!

话说一位在x米工作的朋友,被裁员后投了上百份简历,却始终得不到面试机会。

你说,35岁这个年龄,经验有了,但就是在求职市场上碰壁,感觉像是被时代淘汰了一样。

于是,这位兄弟一气之下,决定改动策略——先把薪资从2W调到3W,然后还把简历从中文改成了英文,完全换个姿势来挑战这个市场。

Image
结果呢?出乎意料的,他收到了很多面试邀请,简直让人眼前一亮!
不禁让我想,很多时候其实不完全是能力的问题,而是方式和定位的问题。
你想想,像我们程序员,技能再强,如果简历没有亮点,可能就被忽视了。加点“神操作”比如提高薪资要求或是转向更国际化的市场,有时反而会吸引到不一样的机会。
总之,给各位正在找工作的老哥们提个醒,不妨试试这种“打破常规”的操作。毕竟,调整策略也是一种技能,谁说35岁就不能逆袭呢?💪😎

算法题:累加数

最近看到一则算法题,叫做:累加数。

说白了,就是给你一个数字,判断这个数字是不是累加数。什么是累加数呢?简单说,如果你能把这个数字分成两部分,每部分都是连续数字,并且这两部分的和恰好等于原始数字,那它就是累加数。听起来像是个简单的数论问题对吧?但实际上,它需要一些巧妙的技巧和对数字运算的敏锐感知。

问题:给定一个数字,判断这个数字是否是累加数。比如“112358”就是累加数,因为你可以把它分成“1, 1, 2, 3, 5, 8”,这些数依次递增,符合累加数的定义。
我们来简单捋一捋题目。我们需要做的,是找出一个数字是否能被分割成若干个连续的数字,且这些数字的和正好等于原始数字。
先不急着上代码,我得想象一下如果我来做这个题该怎么处理。首先,给定一个字符串,我要能从它的不同位置进行切割,得到可能的数字组合。每个组合的起始值需要是连续递增的。这是个典型的暴力解法——穷举所有可能的分割方式,并验证这些分割方式的和是否等于原始数字。
但,暴力法不一定是最优的,所以我们需要优化。比如,我们可以限制一下搜索的范围:我们不可能无休止地试图从任意数字开始分割。假设我们尝试从一个数字的前两位或者前三位开始,然后检验其他部分是否能够继续累加。如果不行,就退回到上一层。
下面我用Java写个简单的解决方案,先尝试暴力解法,再慢慢优化。
public class Solution {
    public boolean isAdditiveNumber(String num) {
        int len = num.length();
        // 遍历所有可能的起始位置
        for (int i = 1; i < len; i++) {
            for (int j = i + 1; j < len; j++) {
                // 获取第一和第二个数字
                String num1 = num.substring(0, i);
                String num2 = num.substring(i, j);

                                // 如果包含前导零就跳过
                if ((num1.length() > 1 && num1.charAt(0) == '0') || (num2.length() > 1 && num2.charAt(0) == '0')) {
                    continue;
                }

                // 以num1和num2为起始,检查后面的数字
                while (j < len) {
                    long sum = Long.parseLong(num1) + Long.parseLong(num2);
                    String sumStr = String.valueOf(sum);
                    // 如果当前和不匹配,说明不符合条件,直接跳出
                    if (!num.startsWith(sumStr, j)) {
                        break;
                    }
                    j += sumStr.length();
                    num1 = num2;
                    num2 = sumStr;
                    if (j == len) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.isAdditiveNumber("112358")); // true
        System.out.println(solution.isAdditiveNumber("199100199")); // true
        System.out.println(solution.isAdditiveNumber("1234")); // false
    }
}

上面这个解法的核心思路是:我们从前两个数字开始,然后用这两个数字的和去验证后面的部分是否符合累加数的规则。如果符合,我们就继续往后检查,直到整个字符串验证完。如果有任何一部分不符合,我们就直接跳出循环,继续试图从其他地方分割。
当然,这个代码没有考虑特别大的数字,这样的数值可能会导致溢出问题。不过,对于常见的情况,它是可以工作的。
看了下这个代码的实现,你可能会觉得:这不就是一个“暴力破解”嘛!确实,这种解法的时间复杂度是O(n^3),即使对于较长的数字字符串,处理起来也会很慢。所以,一般情况下,我觉得我们可以从这个思路出发,尝试一些优化。比如,我们可以引入动态规划的思想,保存某些中间结果,避免重复计算。再或者,采用贪心算法去优化一些不必要的判断,尽量减少循环层数。
希望这篇文章能够帮大家理解累加数的算法思路,不管是暴力破解,还是往优化方面想,都是程序员的“必修课”。你我都一样,做了这个题,才能继续前进。

-END-

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

Image

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