老公税后收入从月薪20K+,骤降到月薪6K。想问下男同胞们,我现在该怎么做能让他好受一些?
刚看到个贴子,说一姑娘老公月薪从税后2w多掉到6k,自己现在13k,还有去发达国家的机会,家里还有刚出生的娃,就愁怎么安慰老公、怎么选路。
怎么说呢,我觉得关键别把问题变成“谁更能赚钱”,而是“这个家怎么走更稳”。
我的看法是:第一,先肯定老公,不要拿收入变化去评价人,可以多聊“你已经很辛苦了,接下来我们一起想办法”。男人丢的往往不是钱,是价值感。第二,那份国外机会别轻易放,普通家庭能遇到一次就很难得,但一定要夫妻俩一起算清:收入、陪伴、签证、老人带娃能不能跟上。
第三,决定无论怎么选,用“我们”这个主语,而不是“我为你放弃”或者“你耽误了我”。
面试题:Z 字形变换
有时候上课无聊,你是不是会在草稿纸上写名字那种花里胡哨的“波浪字”?一会儿往下写,一会儿往上写,写完再一行一行读出来,变成一个新串。Z 字形变换这个题,其实就是在干这么个事儿,只不过从纸上搬到了代码里。
题目大概意思是这样(我用自己的话说一遍):
给你一个字符串 s,还有一个整数 numRows,叫你把这个字符串按“Z 字形”的路线写到一个有 numRows 行的格子里,然后再按从上到下,一行一行读出来,拼成一个新的字符串返回。
举个小例子,你脑子里跟着想就行,不用太较真坐标:
字符串: PAYPALISHIRING行数: numRows = 3
写成 Z 字形大概是这样(用空格补一下位置):
P A H N
A P L S I I G
Y I R
然后按“第一行 → 第二行 → 第三行”读:PAHNAPLSIIGYIR
这个就是答案。
很多人一看到这个“Z”就开始推公式,什么周期啊下标啊,其实一开始完全没必要,直接模拟就够了,而且更好理解。
你就当自己拿着一支笔,在一个有 numRows 行的纸上乱跑:
从第 0 行开始,往下走(0 → 1 → 2 → …) 走到最后一行,掉头往上走(最后一行 → 倒数第二行 → …) 又走到最上面,再掉头往下 走的过程中,每遇到一个字符,就写到当前行的后面
最后,每一行其实就是一段字符串,把所有行拼起来,就是结果。
这个过程对应到代码,其实就是:
准备一个数组,每一行用一个
StringBuilder存;用一个变量
curRow记录当前在哪一行;用一个变量
step表示方向:往下是+1,往上是-1;遍历原字符串
s的每个字符:
把字符丢到 rows[curRow]里根据方向更新 curRow += step如果走到第 0 行了,就改成往下走(step = 1) 如果走到最后一行了,就改成往上走(step = -1)
唯一要注意的特例:
如果 numRows == 1,或者numRows >= s.length(),那没得“Z”可画,直接返回原串就完事了。
上代码,核心逻辑就按上面说的那套来:
publicclassSolution{
public String convert(String s, int numRows){
// 特殊情况:一行或者行数大于等于字符串长度,其实就不需要变换
if (numRows == 1 || numRows >= s.length()) {
return s;
}
// 每一行一个 StringBuilder,用来收集该行的字符
StringBuilder[] rows = new StringBuilder[numRows];
for (int i = 0; i < numRows; i++) {
rows[i] = new StringBuilder();
}
// 当前在第几行,从 0 行开始
int curRow = 0;
// 方向:+1 往下,-1 往上,一开始往下走
int step = 1;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// 把当前字符加到当前行
rows[curRow].append(c);
// 如果到了最后一行,掉头往上
if (curRow == numRows - 1) {
step = -1;
}
// 如果到了第一行,掉头往下
elseif (curRow == 0) {
step = 1;
}
// 往下一个行号走
curRow += step;
}
// 最后把所有行拼起来
StringBuilder result = new StringBuilder();
for (int i = 0; i < numRows; i++) {
result.append(rows[i]);
}
return result.toString();
}
// 简单测一下
publicstaticvoidmain(String[] args){
Solution solution = new Solution();
String s = "PAYPALISHIRING";
int numRows = 3;
String res = solution.convert(s, numRows);
System.out.println(res); // 预期输出: PAHNAPLSIIGYIR
}
}
你可以自己把 numRows 改成 4 再跑一遍,看下结果是不是和题目示例对得上。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html