将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下
P A H N
A P L S I I G
Y I R
来源:力扣(LeetCode)链接:https://leetcode.cn/problems/zigzag-conversion
佬的思路(自己题都没看懂,直接懵了):
这题明显是个找规律的题, 观察图形可以知道“循环体”为一个"Z"字,即0-7,8-15是一个循环
对于循环最常用的就是取%运算,通过简单观察可知,循环体的长度为2numSize -2有了循环体长度之后,自然是对s[i]取模了,即s[i] % (2numSize -2)现在开始分类0 % (2numSize -2) = 0;1 % (2numSize -2)= 1;.........numSize % (2*numSize -2) = numSize;
判断条件:j % (2numSize -2) == i || j %(2numSize -2) == 2*numSize - 2 - i
作者:lang-dao链接:https://leetcode.cn/problems/zigzag-conversion/solution/qing-song-jiao-ni-zhao-gui-lu-by-lang-dao/
C语言:
char*convert(char*s, intnumRows){
intn=strlen(s);
if (numRows==1) returns;
char*res= (char*)malloc(sizeof(char) * (n+1));
intk=0;
for (inti=0; i<numRows; i++) {
for (intj=0; j<n; j++) {
if (j% (2*numRows-2) ==i||
j% (2*numRows-2) ==2*numRows-2-i) {
res[k++] =s[j];
}
}
}
res[k] ='\0';
returnres;
}
// 时长:40ms 空间:6.3MB
Go语言:
作者:zoffer链接:https://leetcode.cn/problems/zigzag-conversion/solution/ji-jian-jie-fa-by-ijzqardmbd/
这个佬的解题过程给得很清晰。
funcconvert(sstring, numRowsint) string {
ifnumRows==1 {
returns
}
rows :=make([]string, numRows)
n :=2*numRows-2
fori, char :=ranges {
x :=i%n
rows[min(x, n-x)] +=string(char)
}
returnstrings.Join(rows, "")
}
funcmin(a, bint) int {
ifa<b {
returna
}
returnb
}
// 时长:8ms 空间:5.4MB
总结:
这道题我想了很久一点思路没有,看到评论和题解,才发现Z字变换就类似找通项公式,我开始以为涉及到多维数组,直接无从下手,知道了自己再算法设计思路上还有不少的欠缺。
收获:
了解Z字变形的过程
学习链接:
Z字变形思路学习-https://blog.csdn.net/qq_23594799/article/details/106152335