题解 | #牛牛的旗语传递# java
牛牛的旗语传递
https://www.nowcoder.com/practice/810b1c80a9c341c4af69facac350d6bc
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @param numRows int整型 * @return string字符串 */ public String decodeFlag (String s, int numRows) { // write code here if (numRows == 1) return s; List<StringBuilder> rows = new ArrayList<>(); for (int i = 0; i < Math.min(numRows, s.length()); i++) { rows.add(new StringBuilder()); } int curRow = 0; boolean goingDown = false; for (char c : s.toCharArray()) { rows.get(curRow).append(c); if (curRow == 0 || curRow == numRows - 1) { goingDown = !goingDown; } curRow += goingDown ? 1 : -1; } StringBuilder res = new StringBuilder(); for (StringBuilder row : rows) { res.append(row); } return res.toString(); } }
Java语言。
这道题目考察的是字符串的编码和解码,以及对字符排列的规律性处理。
解题思路如下:
- 判断特殊情况,如果行数
numRows
为1,那么直接返回原始字符串s
。 - 创建一个字符串列表
rows
,列表的长度为numRows
和s
的长度的较小值。用来存储按照规律排列后的字符。 - 初始化当前行
curRow
为 0,表示当前行为第一行。 - 初始化一个布尔变量
goingDown
,用来判断当前字符的方向是向上还是向下。 - 遍历字符串
s
中的每个字符:将当前字符添加到 rows[curRow] 的末尾。判断当前行 curRow 是否在第一行或最后一行,如果是,则将 goingDown 取反,改变方向。根据 goingDown 的值更新 curRow,如果 goingDown 为真,则 curRow 加 1,否则减 1。 - 构建结果字符串
res
,将列表rows
中的每个元素依次拼接到res
的末尾。 - 返回结果字符串
res
。