程序员老鬼

几年前攒够了 200万,辞职在家靠利息生活,结果没过多久,家人突发重病,花了几十万的医药费,存款一下子就缩水了,不得不重新出来上班。

刚看到个贴子,说有网友几年前攒到200万,就觉得这辈子稳了,辞职在家靠利息过日子。结果家人突发重病,医药费咔咔几十万,存款一下子瘦了一圈,人也不得不回去上班。

Image

我觉得这事吧,说残酷也不算残酷,只是把很多人的“幻觉”戳破了:200万不是免死金牌,更不是一劳永逸的退场券。

但换个角度想,不是不该休息,而是不能把未来押在一个静止不动的数字上。

说到底,普通人的安全感,不是那一笔钱,而是持续赚钱的能力、基本的保险保障,还有扛事的心态。钱可以花没,本事和心态只会越用越值钱。

与其算利息,不如先把自己的“抗风险能力利息”做高一点。

面试题:颜色分类

昨天晚上十一点多吧,我在公司楼下抽烟(别学哈),我们组小李突然微信甩我一句:“东哥,颜色分类你会不会…明天面试要讲”我当时脑子还在想线上那个慢 SQL,差点回他“你分类啥颜色,先把你日志分级分清楚”…但想想这题挺像工程里做“分流”,0/1/2 三种状态,别整那些花里胡哨排序,搞个一趟扫描就完事了。

你把数组想成一条流水线:左边最终都得是 0,中间是 1,右边是 2。然后我一般就拿三个指针说人话:p0 指向“下一个该放 0 的坑”,p2 指向“下一个该放 2 的坑”,中间用 i 在那儿巡逻。规则其实就三条,跟值班一样死板: 看到 0,跟 p0 交换一下,把 0 送左边去,p0++,i++; 看到 2,跟 p2 交换,把 2 送右边去,p2--,注意这时候 i 先别动,因为换过来的那个数你还没验身份; 看到 1,就别折腾,i++ 走人。 就这个,别背,理解成“0 左移、2 右移、1 原地过安检”,一下就通了。

我以前带新人讲这题,会顺嘴加一句“别用 sort()”,不是装,是因为线上你经常遇到只能单趟、原地、还要稳定心智的场景,比如日志按级别分桶、消息按优先级打散,思路都一样:维护区间不变式,比你写十个 if-else 可靠得多。

代码我给你一份 Java 的,写得稍微工程化点,异常也不搞复杂,面试够用了:

publicclassSortColors{

// nums 里只包含 0/1/2
publicstaticvoidsortColors(int[] nums){
if (nums == null || nums.length <= 1) return;

int p0 = 0;                 // [0, p0) 都是 0
int i = 0;                  // [p0, i) 都是 1(处理中会动态形成)
int p2 = nums.length - 1;   // (p2, end] 都是 2

while (i <= p2) {
int v = nums[i];
if (v == 0) {
                swap(nums, i, p0);
                p0++;
                i++;
            } elseif (v == 2) {
                swap(nums, i, p2);
                p2--;
// i 不动,继续检查换回来的值
            } else { // v == 1
                i++;
            }
        }
    }

privatestaticvoidswap(int[] a, int i, int j){
if (i == j) return;
int t = a[i];
        a[i] = a[j];
        a[j] = t;
    }

// 小跑一下看看
publicstaticvoidmain(String[] args){
int[] nums = {2, 0, 2, 1, 1, 0};
        sortColors(nums);
for (int x : nums) System.out.print(x + " ");
// 0 0 1 1 2 2
    }
}

你要是讲解的时候怕面试官追着问“为啥 i 换到 2 的时候不加”,你就拿刚才那句“换回来的还没验”去顶,特别好用,语气稳一点就像你真在线上扛过事一样。哦对了,我自己有个小习惯:画三个区间在纸上,边界写清楚,嘴就不会飘,讲着讲着也不容易把自己绕进去。