程序员老鬼

老公税后收入从月薪20K+,骤降到月薪6K。想问下男同胞们,我现在该怎么做能让他好受一些?

刚看到个贴子,说一姑娘老公月薪从税后2w多掉到6k,自己现在13k,还有去发达国家的机会,家里还有刚出生的娃,就愁怎么安慰老公、怎么选路。

Image

怎么说呢,我觉得关键别把问题变成“谁更能赚钱”,而是“这个家怎么走更稳”。

我的看法是:第一,先肯定老公,不要拿收入变化去评价人,可以多聊“你已经很辛苦了,接下来我们一起想办法”。男人丢的往往不是钱,是价值感。第二,那份国外机会别轻易放,普通家庭能遇到一次就很难得,但一定要夫妻俩一起算清:收入、陪伴、签证、老人带娃能不能跟上。

第三,决定无论怎么选,用“我们”这个主语,而不是“我为你放弃”或者“你耽误了我”。

面试题: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 → …)
  • 走到最后一行,掉头往上走(最后一行 → 倒数第二行 → …)
  • 又走到最上面,再掉头往下
  • 走的过程中,每遇到一个字符,就写到当前行的后面

最后,每一行其实就是一段字符串,把所有行拼起来,就是结果。

这个过程对应到代码,其实就是:

  1. 准备一个数组,每一行用一个 StringBuilder 存;

  2. 用一个变量 curRow 记录当前在哪一行;

  3. 用一个变量 step 表示方向:往下是 +1,往上是 -1;

  4. 遍历原字符串 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