力扣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.遍历字符串数组中的每一行进行拼接,返回即可。

代码:

 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 }

posted on 2022-06-18 10:33  我不想一直当菜鸟  阅读(87)  评论(0编辑  收藏  举报