leetcode 6. ZigZag Conversion
https://leetcode.com/problems/zigzag-conversion/
题目: 将字符串转化成zigzag模式。
例如 "abcdefghijkmlnpq"
当为4行,zigzag模式为:
a g lb f h m nc e i k pd j q输出为aglbfhmnceikpdjq当为5行,zigzag模式为:a ib h j qc g k pd f l ne m输出为aibhjqcgkpdflnem思路:以题目中当行为4的为例,将字符串"abcdefghijkmlnpq" 首先转换为"abcd/fe/ghij/km/lnpq".其实/代表空格。这样最后的输出就从以span=4,从j=0开始a/g/l. 再从j=1开始bfhmn,...,一直到j=4,d/j/q.其中去掉/。
所以首先需要将原字符串转换为用空格填充的字符串。从上面的例子可以看出规则。首先是numRows个字符为一列,然后numRows-2个字符为反序的一列,其上下各有一个空格。
1 class Solution { 2 public: 3 string convert(string s, int numRows) { 4 int i=0,k=0,j; 5 int len=s.length(); 6 string ss=""; 7 int flag=0; 8 while(i<len){ 9 j=numRows-flag; 10 if(flag==0){ 11 while(i<len&&j>0&&j--){ 12 ss+=s[i++]; 13 } 14 while(j>0&&j--){ 15 ss+=' '; 16 } 17 flag=2; 18 } 19 else { 20 ss+=' '; 21 string temp=""; 22 while(i<len&&j>0&&j--){ 23 temp+=s[i++]; 24 } 25 std::reverse(temp.begin(),temp.end());
26 27 while(j>0&&j--){ 28 ss+=' '; 29 } 30 ss+=temp; 31 ss+=' '; 32 flag=0; 33 } 34 } 35 string s1=""; 36 k=ss.length(); 37 for(i=0;i<numRows;i++){ 38 j=i; 39 while(j<k){ 40 if(ss[j]!=' ') 41 s1+=ss[j]; 42 j+=numRows; 43 } 44 } 45 return s1; 46 } 47 };
leetcode上运行时间为 24ms