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)

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 text, int nRows);
convert("PAYPALISHIRING", 3)  should return  "PAHNAPLSIIGYIR” .
Tag: String

public class Solution {
    public String convert(String s, int nRows) {
        
    }
}

分析:
字符串 "PAYPALISHIRING”  是以zigzag模式写的,如下图所示(忽略渣画功)
ZigZag Conversion_第1张图片

P   A   H   N
A P L S I I G
Y   I   R 
然后横着打印出来: ”PAHNAPLSIIGYIR”。
还有一个参数nRows。是分成几行来画zip。
对于nRows=3来说。通过观察结果的第一行为PAHN,分别是
0,4,8 。。。个元素。
第二行为 1,3,5.。。。元素,第三行为2,6,10元素。
当nRows=4时,应该为:
P I
A L S
Y A H
P I   后面略

分别第一行好办,0,6,12,
第二行:1,5,7,11
第三行:2,4,8.10
第四行:3,9,15.
所以可以得到2种解法。
解法1.建立nRows个队列。依次入队,然后按照1234顺序打印每个队即可。
入队列的时候,要考虑其123 21这样入队列。
public static String convert(String s, int nRows) {

String result = "";
int n = 0;
boolean seq = true;
if(nRows == 1) return s;
LinkedList<Character>[] queue =  new LinkedList[nRows];
for (int i = 0; i < nRows; i++) {
queue[i]= new LinkedList<Character>();
}
for (int i = 0; i < s.length(); i++) {
//for (int j = 0; j < nRows; j++) {
queue[n].offer(s.charAt(i));
if(seq) n++;
else n--;
if(n==nRows-1) seq = false;
else if(n==0) seq = true;
//}
}
for (int i = 0; i < nRows; i++) {
while(!queue[i].isEmpty())
result +=queue[i].poll();
}

return result;

}


不过提示内存超了。



解法2,直接从数组里取数打印。n=nrows。
第一行0,0+(2n-2),(2n-2)+(2n-2)。。。。
第二行 1,1+(2n-2*2),1+1*(2n-2),1+(2n-2*2)+1*(2n-2)


    public static String convert(String s, int nRows) {
     
     String result="";
     if(nRows==1) return s;
     for (int i = 0;i<nRows;i++){
     int k=0;
     while(true){
     int first=i+k*(2*nRows-2);
     int second=i+2*nRows-2*(i+1)+k*(2*nRows-2);
     if(first>=s.length()) break;
     result += s.charAt(first);
     if(second>=s.length()) break;
     if(nRows>=s.length()) break;
     if(i!=0&&i!=nRows-1) result += s.charAt(second);
     k++;
     
     }    
     }
     
     return result;
     
        
    }



你可能感兴趣的:(算法)