当前位置: 代码迷 >> 综合 >> lectcode-z字形变换
  详细解决方案

lectcode-z字形变换

热度:97   发布时间:2024-01-25 06:02:42.0

z字形变换

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:

L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。

示例

示例 1:

输入: s = “LEETCODEISHIRING”, numRows = 3

输出: “LCIRETOESIIGEDHN”

示例 2:

输入: s = “LEETCODEISHIRING”, numRows = 4

输出: “LDREOEIIECIHNTSG”

解释:

L D R
E O E I I
E C I H N
T S G

代码

  • 按行排序

string convert(string s, int numRows) {int n = s.size();vector<string> res(min(numRows,n));int rows = 0;bool godown = false;if(n<=numRows||numRows ==1) return s;for(char c:s){res[rows] += c;if(rows==0||rows==numRows-1) godown = !godown;rows += godown?1:-1;}rows = 0;string ret;for(string row:res) ret += row;return ret;
}
  • 按行访问

 string convert(string s, int numRows) {if(numRows==1) return s;int n = s.size();int rows = 2*numRows-2;  string ret;              for(int i = 0;i<numRows;i++)for (int j = 0; j + i < n; j += rows) {ret += s[j + i];if (i != 0 && i != numRows - 1 && j + rows - i < n)ret += s[j + rows - i];}return ret;
}

总结

  • 按行排序按照z字形形成的过程来构造,容易理解,但注意n<=numRows||numRows ==1这两个条件成立可以直接输出,如果numRows=1可以运行到下一级,会发生rows=-1的情况,会发生错误。
  • 按行访问将z字形的每个字母的位置找出来,然后存入结果中。