网友几年前攒到200万就辞职回家,打算靠利息过小日子。结果家人突然重病,几十万医药费下去,存款肉眼可见地缩水,只能又硬着头皮回去上班。
我的看法是: 200万,对普通家庭来说只是安全垫,不是免死金牌,更不是财务自由。
靠利息生活听着很爽,但风险一点都不小。利率会变,物价会上涨,最大的不确定就是“意外和疾病”。你指望一笔存款扛一辈子,其实就是拿整个家庭的未来在赌运气。
换个角度想,工作有时候不是“热爱”,但它是你对抗风险的武器,是不断补血的血袋。与其幻想早点退休,不如先把三件事做好:稳定现金流、基础保险、持续赚钱能力。
昨天晚上十一点多吧,我在公司楼下抽烟,手机又弹出来一个群消息,“东哥那个颜色分类咋写啊,我老卡住”…我当时困得不行还嘴硬,说这题不就跟你洗衣服分三堆一样么,红的白的蓝的,别一件一件先拿去阳台再回来拿第二件,那不累死,得边拿边分,手里还得留个“空位”方便换,对吧。
颜色分类这题其实就三个值 0/1/2(你也可以理解成红白蓝),目标是原地把数组排成 0 在左,1 在中间,2 在右。很多人第一反应是计数两遍,当然也行,但我更喜欢一遍过那个“荷兰国旗”写法,原因也简单:线上你遇到的多半不是“能不能做”,是“能不能稳、能不能快、能不能少出幺蛾子”。
你就想象你有三个指针: 一个 left,永远指着“下一个应该放 0 的坑”; 一个 right,永远指着“下一个应该放 2 的坑”; 中间有个 i 在扫,像你手伸进洗衣篮子一件一件摸出来。
规则特别像你在现场指挥搬箱子:
i 看到 0:那就把它跟 left 换一下,left++,i++(因为换过来的东西,left 之前都处理干净了,放心走)
i 看到 1:啥也别动,i++(1 就待在中间区)
i 看到 2:把它跟 right 换一下,right--,但是 i 先别动(因为从右边换回来的那个货你还没看过,可能又是 2,也可能是 0,急着 i++ 就容易漏)
就这么点事儿,但写代码的时候最容易写错的就是“换 2 以后 i 要不要++”,很多人线上 bug 就卡这儿,真的…我见过同事把 i++ 写了,结果某些输入直接排序不完整,还以为是 JVM 抽风。
上代码,java,我写个干净点的,你拿去刷题或者塞到项目里都行:
import java.util.Arrays;
publicclassSortColors{
// 颜色分类:0/1/2 原地排序,单趟扫描
publicstaticvoidsortColors(int[] nums){
if (nums == || nums.length <= 1) return;
int left = 0; // [0, left) 都是 0
int right = nums.length - 1; // (right, end] 都是 2
int i = 0; // 当前扫描指针
while (i <= right) {
int v = nums[i];
if (v == 0) {
swap(nums, i, left);
left++;
i++;
} elseif (v == 1) {
i++;
} else { // v == 2
swap(nums, i, right);
right--;
// 注意:这里 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);
System.out.println(Arrays.toString(nums)); // [0, 0, 1, 1, 2, 2]
}
}
你看这个 while(i <= right) 也很关键,别写成 i < nums.length,那样 right 往左缩的时候你还在傻跑,等于扫过“已经确定是 2 的区域”,白干活还容易越界想不通。
还有个小细节我一般会跟新人说:这题的“架构味”其实在于你能不能把区间不变量说清楚。left 左边永远干净,right 右边永远干净,中间 i 负责“把未知区一点点吃掉”。你把这几个区想明白,很多双指针三指针题就突然不玄学了,真的是…就跟你排查线上问题一样,把边界画清楚,剩下都是体力活。
行了我先不扯了,群里还在@我问“为啥换 2 不动 i”,我得去怼两句,不然他们又要说我讲得太快了…哎先这样。
热门跟贴