leetcode-个人题解6
来源:互联网 发布:java如何获取微信code 编辑:程序博客网 时间:2024/05/06 18:25
LEETCODE专题
6. ZigZag Conversion
照例先上个题目要求:
这里首先讲一下什么叫“ZigZag Pattern”。
简单来说就是两条平行线之间的一条有折角的曲线,每个折角度数相同并且角的顶点均在两条平行线上。而适用到这道题上,其实也就是“N”上下颠倒的形状。
实现的主要问题只有一个:如何找到每一行字符下标的变换规律
这里要多举点例子仔细观察一下。譬如题目给的例子,改一下行数就会发现其实字符下标是有周期的,而这个周期就是2 *(numRows - 1)。
输入: "PAYPALISHIRING" 3 P A H N APLSIIG Y I R 输出: "PAHNAPLSIIGYIR" 输入:"PAYPALISHIRING" 4 P I N A LS IG YA HR P I 输出: "PINALSIGYAHRPI" 输入: "PAYPALISHIRING" 5 P H A SI Y I R PL IG A N 输出: "PHASIYIRPLIGAN"
有好几行在一个周期内除了周期对应的字符外,还有其它的字符。这个字符在某些人的解法里被称为“partner”,找到了该字符与其“partner”的下标变换规律之后,其实也就找到了改行内所有字符下标的变换规律,自然也就能解决这一行的所有字符输出了。但是,第一行和最后一行的字符是没有“partner”的,这点要尤其注意!
最后就是一个细节问题,警惕输入只有一个字符或者输入的行数只有1
下面直接上code:
class Solution {public: string convert(string s, int numRows) { int i, index, change; string result; for (i = 1; i < numRows; i++) { index = i - 1; change = 2 * (numRows - i); while (index < s.length()) { result += s[index]; index += change; change = i == 1 ? 2 * (numRows - i) : 2 * (numRows - 1) - change; } } // Now i == numRows index = i - 1; change = numRows == 1 ? 1 : 2 * (numRows - 1); while (index < s.length()) { result += s[index]; index += change; } return result; }};
时间复杂度:O(n)
阅读全文
0 0
- leetcode-个人题解6
- leetcode-个人题解2
- leetcode-个人题解4
- leetcode-个人题解8
- leetcode-个人题解23
- leetcode-个人题解12
- Leetcode个人题解455
- Leetcode个人题解10
- Leetcode-个人题解718
- Leetcode个人题解714
- Leetcode个人题解712
- Leetcode个人题解11
- Leetcode个人题解14
- Leetcode个人题解55
- Leetcode个人题解65
- LeetCode题解2.1.6
- 3Sum Closest - leetcode 16号题目个人题解
- Add and Search Word - leetcode 221号题目个人题解
- eclipse安装SVN插件
- Linux探秘之用户态与内核态
- 10月5日 c语言 3*4矩阵 求出其中值中最大的那个元素的值,以及其所在的行号和列号
- PKU 2195 Going Home
- leetcode32 Longest Valid Parentheses 最长有效括号序列
- leetcode-个人题解6
- 学习Linux C编程之运算符、表达式
- 取石子(七)
- bzoj4819: [Sdoi2017]新生舞会
- MongoDB的配置与简单使用
- springmvc学习笔记(7)-springmvc整合mybatis之mapper
- 三. Requests库的基本使用
- HDU
- 【bzoj1570】Blue Mary的旅行