[LeetCode题解] ZigZag Conversion
原文在这,可以来我blog翻翻哦。
第二天。今天AC掉了一道之前没AC掉的题目。。。今天的题目是6. ZigZag Conversion
题目描述:
The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
PAHN
A P L S I I G
YIR
And then read line by line: "PAHNAPLSIIGYIR"
【[LeetCode题解] ZigZag Conversion】Write the code that will take a string and make this conversion given a number of rows:
string convert(string s, int numRows);
Example 1:
Input: s = "PAYPALISHIRING", numRows = 3
Output: "PAHNAPLSIIGYIR"
Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:PIN
AL SI G
Y AH R
PI
恩,又是一道“编程题“, 并不涉及到什么算法,静下心来仔细想想还是能做出来的。做这道题的思路就是一点一点跑例子,找出其中的规律就好了。
我们先以输入为
s = "PAYPALISHIRING", numRows = 3
为例子,这是题目给出的例子,正确答案已经有了。先把Z字型画出来(不难发现,题目在最开始其实已经给出了答案):
PAHN
A P L S I I G
YIR
观察上面的例子我们可以发现:
- 第一行中的元素在原来的字符串中下标相差4个。
- 第二行中的元素在原来字符串中下标相差2个。
s = "PAYPALISHIRING", numRows = 3
,把Z字型画出来:PIN
AL SI G
Y AH R
PI
可以看到第一行的元素在原来字符串中的下标相差6个,但是第二行却出现了一些不一样的情况:
-
A
与L
相差4个,L
与S
却相差2个 -
S
与I
相差4个,I
与G
却相差2个
offset
是有规律的,而且好像需要分成两种情况,继续看看第3行:-
Y
与A
相差2个,A
与H
相差4个 -
H
与R
相差4个,如果还有元素的话,下一个元素与R
之间显然相差2个。
offset
是不断在两个数字间不断变换的。我们尝试用两个数组来保存这些
offset
,我们把这两个数组定义为skipDown
和skipUp
。其中skipDown
表示下标在z字型中经过了一个向下的剪头,如第二个例子中,第一行的P
移动到I
时,P
经过了AYPAl
组成的向下的剪头。skipUp
同理可推。如果我们继续跑例子的话,应该是比较容易找出规律的:
- 第
i
行的skipDown
为2*(i-1)
,而第一行和最后一行的skipDown
都应该为2*(numRows)
。 -
skipDown
与skipUp
是逆序的关系。
string convert(string s, int numRows) {
if (numRows < 2) return s;
vector skipDown(numRows);
vector skipUp(numRows);
skipDown[0] = 2*(numRows-1);
skipUp[0] = 0;
for(int i = 1;
i < numRows;
i++) {
skipDown[i] = skipDown[i-1] - 2;
skipUp[i] = skipUp[i-1] + 2;
}skipDown[numRows-1] = skipDown[0];
skipUp[0] = skipUp[numRows-1];
string res(s.size(), ' ');
int index = 0;
for(int i = 0;
i < numRows;
i++) {
bool flag = true;
for(int j = i;
j < s.size();
index++) {
res[index] = s[j];
if (flag) { j += skipDown[i];
}
else { j += skipUp[i];
}flag = !flag;
}
}
return res;
}
当然这肯定不是最优的代码,比如其实我们可以不用两个数组,甚至不用数组来保存的
offset
,但是这样写会比较容易理解,代码会比较简单点。推荐阅读
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- leetcode|leetcode 92. 反转链表 II
- ACSL|ACSL 美国计算机科学联赛 2016-2017 R4 摩天大楼-Skyscraper 题解
- 二叉树路径节点关键值和等于目标值(LeetCode--112&LeetCode--113)
- LeetCode算法题-11.|LeetCode算法题-11. 盛最多水的容器(Swift)
- LeetCode(03)Longest|LeetCode(03)Longest Substring Without Repeating Characters
- Leetcode|Leetcode No.198打家劫舍
- [leetcode数组系列]1两数之和
- 数据结构和算法|LeetCode 的正确使用方式
- leetcode|今天开始记录自己的力扣之路