[LeetCode]ZigZag Conversion

Description:

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”.

解析:zigzag一开始我也没太明白是什么意思,google了下才知道。其实就是把字符串原顺序012345678。按如下排列:

rows3
0 4 8
1357
2 6
rows:4
0   6
1 5 7
24  8
3

然后输出每行的字符,就是最后的结果。
比较简单粗暴的解法,用字符串数组存储每一行,最后拼接就是结果。
code:

 public String convert(String s, int numRows) {
        if(s==null||s.length()==0)return s;
        int len = s.length();
        int row = 0;
        //用来记录正向还是反向
        int index = 1;
        String[] result = new String[numRows];
        Arrays.fill(result,"");
        for(int i=0; i<len; i++)
        {
            result[row] += s.charAt(i);
            row += index;
            if(row>=numRows)
            {
                row =numRows - 2;
                index = -1;
            }

            if(row < 0)
            {
                row = 1;
                index = 1;
            }
        }
        String str = "";
        for(int j=0; j<numRows; j++)
        {
            str +=result[j];
        }
        return str;

    }

高级解法【搬运leetcode】:
Create nRows StringBuffers, and keep collecting characters from original string to corresponding StringBuffer. Just take care of your index to keep them in bound.

public String convert(String s, int nRows) {
    char[] c = s.toCharArray();
    int len = c.length;
    StringBuffer[] sb = new StringBuffer[nRows];
    for (int i = 0; i < sb.length; i++) sb[i] = new StringBuffer();

    int i = 0;
    while (i < len) {
        for (int idx = 0; idx < nRows && i < len; idx++) // vertically down
            sb[idx].append(c[i++]);
        for (int idx = nRows-2; idx >= 1 && i < len; idx--) // obliquely up
            sb[idx].append(c[i++]);
    }
    for (int idx = 1; idx < sb.length; idx++)
        sb[0].append(sb[idx]);
    return sb[0].toString();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值