6——Z 字形变换(ZigZag Conversion)

Posted ly570

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6——Z 字形变换(ZigZag Conversion)相关的知识,希望对你有一定的参考价值。

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

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

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

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);
1
示例1
输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"
1
2
示例2
输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:

L D R
E O E I I
E C I H N
T S G
1
2
3
4
5
6
7
8
例题解法:
因为我自己写的将近 100 行代码,实在不能看,所以就去看了解析,下面是解析的解法。
由题我们可知一般情况下输出的行数就是传入的 numRows,而当传入的字符串字符数小于 numRows 时,行数即为该字符串所包含的字符数,所以直接用 n(行数)个 StringBuilder 来存储每行的字符,最后再将它们连接到一起即我们要输出的结果。(真是巧妙啊这个方法)
尤其要注意当字符数少于需要输出的行数这种情况。

class Solution
public String convert(String s, int numRows)
if (numRows == 1)
return s;

ArrayList<StringBuilder> arrs = new ArrayList<>();
for (int i = 0; i < Math.min(numRows, s.length()); i++)
arrs.add(new StringBuilder());

boolean direction = true;
int cur_row = 0;
for (int i = 0; i < s.length(); i++)
arrs.get(cur_row).append(s.charAt(i));
cur_row = cur_row + (direction ? 1 : -1);
if (cur_row == 0 || cur_row == numRows - 1) direction = !direction;

StringBuilder result = new StringBuilder();
for (int i = 0; i < arrs.size(); i++)
result.append(arrs.get(i));

return result.toString();


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
自己的憨憨解法
是真的菜,还想先去计算了数组大小,然后再数组一个一个添加,实属憨憨写法,只有我自己能看懂。

class Solution
public String convert(String s, int numRows)
int n = numRows;
String result = "";
int len = s.length();
int column = 0;
if (n == 1)
column = len;
result += s;
else if (n == 2)
column = len/2 + len%2;
for (int i=0, j=0; i < column; i++, j+=2)
result += s.charAt(j);

if (len%2 == 1)
for (int i=0, j=1; i < column-1; i++, j+=2)
result += s.charAt(j);

else
for (int i=0, j=1; i < column; i++, j+=2)
result += s.charAt(j);


else
int length = len;
boolean a = true;
int l_str = 0, s_str = 0;
while (length != 0)
if (a)
l_str++;
if (l_str == n)
a = false;
l_str = 0;
column++;

else
s_str++;
if (s_str == (n-2))
a = true;
s_str = 0;

column++;

length--;

if (l_str>0 && l_str<n)
column++;

char[][] z = new char[n][column];
for (int m = 0; m < n; m++)
for (int k =0; k < column; k++)
z[m][k] = 32;


ArrayList<Character> arr = new ArrayList<>();
for (int i = 0; i < len; i++)
arr.add(s.charAt(i));

int long_str_count = 0; //max is n
int single_char_count = 0; //max is 3n-2
boolean flag = true;
int i = 0, j = 0;
while (true)
if (flag)
z[i][j] = arr.get(0);
arr.remove(0);
long_str_count++;
if (arr.isEmpty())
break;

if (long_str_count==n)
flag = false;
long_str_count = 0;
i--;
j++;
else
i++;

else
z[i][j] = arr.get(http://www.my516.com);
arr.remove(0);
single_char_count++;
if (arr.isEmpty())
break;

if (single_char_count == (n-2))
flag = true;
single_char_count = 0;
else

j++;
i--;


for (int m = 0; m < n; m++)
for (int k =0; k < column; k++)
if (z[m][k] != 32)
result += z[m][k];




return result;


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
获得知识
StringBuilder 比 String 执行更快,因为使用 String 进行连接时,每次都会创建一个新的对象,而 StingBuilder 不会。
--------------------- 

以上是关于6——Z 字形变换(ZigZag Conversion)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 6 Z 字形变换

力扣6. Z 字形变换

[LeetCode] 6. Z 字形变换

逐步解析力扣6. Z 字形变换(使用布尔控制上下遍历)

Leetcod6. Z 字形变换(规律题)

leetcode算法:6.Z 字形变换