力扣6(java)-Z字形变换(中等)
题目:
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"
示例 2:
输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P I N
A L S I G
Y A H R
P I
示例 3:
输入:s = "A", numRows = 1
输出:"A"
提示:
- 1 <= s.length <= 1000
- s 由英文字母(小写和大写)、',' 和 '.' 组成
- 1 <= numRows <= 1000
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
1.如果 numRows == 1,则直接返回s即可;
2.设置一个字符串数组res,遍历字符串s将每个字符加入到字符数组中对应的行,字符串数组的长度为numRows与字符串s长度的最小值(例如 numRows = 3,s.length() = 2,实际行数还是只有2);
3.设置两个变量,loc代表当前行数,flag代表遍历的方向,初始值为loc = 0,flag = false;
4.如果loc == 0 || loc = numRows-1,则遍历的方向需要反向,即 flag = !flag;
5.如果 flag = true,则遍历的方向从上往下,loc++,将当前字符加入到res[loc]中,如果 flag = false,则遍历的方向从下往上,loc--,将当前字符加入到res[loc]中;
6.遍历字符串数组中的每一行进行拼接,返回即可。
![](https://img2022.cnblogs.com/blog/2546223/202206/2546223-20220618101128598-1016750311.jpg)
代码:
1 class Solution { 2 public String convert(String s, int numRows) { 3 //如果行数只有一行,直接返回即可 4 if(numRows == 1) return s; 5 //选择长度和行数的最小值 6 int n = Math.min(s.length(), numRows); 7 String[] res = new String[n]; 8 9 //初始化res 10 for(int i = 0; i < n; i++) res[i] = ""; 11 //loc当前行数,flag方向 12 int loc = 0; 13 boolean flag = false; 14 15 for(int i = 0; i < s.length(); i++){ 16 res[loc] += s.substring(i, i+1); 17 //在第一行或最后一行则需要反方向遍历 18 if(loc == 0 || loc == numRows - 1) 19 flag = !flag; 20 //如果flage为true,表示向下遍历 21 loc += flag ? 1 : -1; 22 } 23 //拼接字符串 24 String ans = ""; 25 for(String row : res){ 26 ans += row; 27 } 28 return ans; 29 } 30 }