leetcode刷题记录——N字变换

将一个给定字符串 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值