aiheshan

有多自律,才能有多自由

导航

leetcode 6. ZigZag Conversion

https://leetcode.com/problems/zigzag-conversion/

题目: 将字符串转化成zigzag模式。

例如 "abcdefghijkmlnpq" 

当为4行,zigzag模式为:

a    g    l
b f h m n
c e i k   p
d   j      q
输出为aglbfhmnceikpdjq
当为5行,zigzag模式为:
a    i
b h j q
c g k p
d f l  n
e   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

posted on 2016-08-13 20:39  aiheshan  阅读(292)  评论(0编辑  收藏  举报