标签:like write for循环 amp fixed 找规律 spl pat wan
仅供自己学习
题目:
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)
P A H N
A P L S I I G
Y I R
And then read line by line: "PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:
string convert(string s, int numRows);
思路:
题目很简单,有两种思路。
1.找规律,按照规律传值到新字符串中。将字符串的位置按照题目要求的排列,可知每相邻两列的元素index相差 2(numRows-1),而Z字中间的的数遵循规律 j +2(numRows-1)-2*i,j是该中间的元素 左边元素的index。
代码:
1 class Solution { 2 public: 3 string convert(string s, int numRows) { 4 if (numRows <= 1) return s; 5 string str; 6 int len= 2 * numRows - 2, n = s.size(); 7 for (int i = 0; i < numRows; ++i) { 8 for (int j = i; j < n; j += len) { //一行一行的传值 9 str+= s[j]; //对Z字竖着的那列传值 10 int pos = j + len - 2 * i; //计算Z字斜着的元素index 11 if (i != 0 && i != numRows - 1 && pos < n) str += s[pos]; //行数不为首行和最后一行就进行Z斜着的元素进行传值。 12 } 13 } 14 return str; 15 } 16 };
2.用vector创建行数为numRows的向量。将s中的元素 按题目要求的传入。
代码:
1 class Solution { 2 public: 3 string convert(string s, int numRows) { 4 if(numRows ==1) return s; 5 string str; 6 int n =s.size(); 7 int i=0; 8 vector<string> temp(numRows); 9 while(i<n){ 10 for(int pos=0;pos<numRows&&i<n;++pos){ //按行向下加入竖列的元素 11 temp[pos]+=s[i++]; 12 } 13 for(int pos=numRows-2;pos!=0&&i<n;--pos){ //在有斜列的行的字符串加入斜列元素。因为从下往上第一个有斜列元素的行数为numRows-2. 14 temp[pos]+=s[i++]; 15 } 16 } 17 for(auto &a:temp) str+= a; //将temp的元素传给a,类似for循环传值。 18 return str; 19 } 20 };
leetcode小白刷题之旅----6. ZigZag Conversion
标签:like write for循环 amp fixed 找规律 spl pat wan
原文地址:https://www.cnblogs.com/Mrsdwang/p/14328193.html