36岁后端研发,娃两岁,老婆全职带娃,手里一共320万,天津和老家河北小城怎么选?
刚看到个贴子,说一位36岁的后端研发,娃两岁,老婆全职带娃,手里320万,在天津和河北老家之间犹豫。
天津房子贵,怕找不到工作;回老家生活轻松点,但也可能得转行。网友们一半劝他“留在大城市拼一拼”,一半说“老家稳定才是真”。
我觉得这事吧,其实没有标准答案。关键是——你想要什么样的生活。天津可能有更多机会,但也意味着更大压力;老家可能安稳,却也容易被“安稳”困住。像选股票一样,风险和收益永远成正比。
从我的角度看,有娃有家的人,更要考虑现金流和心态的可持续。钱是要赚,但家庭幸福感更值钱。
稳住情绪、保留技能,在哪儿都能过好日子。城市只是背景,过得好不好,关键还是人。【备注:文末可领最新资料】
算法题:多次求和构造目标数组
假设你一开始有一个数组,全是 1,比如长度是 n 的 [1, 1, 1, ..., 1]。 然后你可以做若干次操作,每次挑一个位置 i,把 target[i] 改成当前数组所有元素的和。 最后问你:能不能通过这样不断“求和更新”的操作,构造出目标数组 target?
举个例子:target = [9,3,5]过程大概是这样: 一开始 [1,1,1],总和是 3改第三个位置为 3,得到 [1,1,3]再改第三个位置为 5(此时总和是 5) 然后继续... 最后能不能到 [9,3,5]?
思路分析
一眼看过去好像是从小往大加,但那样推演会非常慢。 一个经典的思路是反向思考——与其从 [1,1,1] 去构造 target,不如反过来: 从 target 反推回 [1,1,1]。
怎么反推? 很简单:如果某个位置的数是由“上一次总和”得到的,那上一步它的值应该是 当前值 - 其他元素之和。 换句话说:
maxVal = 当前数组中最大的数
sum = 所有元素的和
rest = sum - maxVal
那么上一步这个最大值就该是:
maxVal' = maxVal % rest
为什么?因为这相当于不断用 rest 加到它自己上,直到到达 maxVal。 如果 % 之后结果是 0,说明上一步它其实是 rest(否则就永远是 0 了)。
Java 实现
我们可以用一个大根堆(PriorityQueue),每次取出最大的数来反推。
import java.util.PriorityQueue;
publicclassConstructTargetArray{
publicbooleanisPossible(int[] target){
PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a);
long sum = 0;
for (int n : target) {
pq.add(n);
sum += n;
}
while (true) {
int max = pq.poll();
long rest = sum - max;
if (max == 1 || rest == 1) returntrue;
if (rest == 0 || max < rest) returnfalse;
int prev = (int) (max % rest);
if (prev == 0) prev = (int) rest;
pq.add(prev);
sum = rest + prev;
}
}
publicstaticvoidmain(String[] args){
ConstructTargetArray obj = new ConstructTargetArray();
System.out.println(obj.isPossible(newint[]{9, 3, 5})); // true
System.out.println(obj.isPossible(newint[]{1, 1, 1, 2})); // false
}
}
核心逻辑
取最大:因为每次求和更新只会让一个数变大,其他数保持不变,所以最大值一定是“最后被更新”的。
反向取模:
max % rest就是回溯前的值。边界条件:
如果 max == 1或rest == 1,说明可以回到[1,1,...];如果 rest == 0(全 1 除了一个超大的数),不可能;如果 max < rest(大数反而小于总和的其他部分),也不可能。
这题其实是贪心 + 反向思维的经典案例。 重点不是推公式,而是理解“求和操作”的本质:一次操作只影响一个数,而总和的增长规律可以逆推回来。 写代码时注意用 long 存 sum,否则会溢出。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html