ZigZag
1、题解
给出字符串helloWorld!
- 这是3行
从左往右依次是holelWrdlo!
- 这是4行
从左往右依次是hoeWrlol!ld
2、思路
每一行都是独立的字符串,最后拼接起来就ok。
3、实现
1、n行即n个String,考虑到字符串经常拼接修改,故使用StringBuiler能大大提高效率。
StringBulier[] sb = new StringBuiler[n] //n行
2、观察规律,发现4个一组(红色框框部分)。
由此可见,我们只需循环红色部分即可。红色部分包含两部分:左侧n个,右侧n-2个。
每一个红框部分如下:
for (int i = 0; i < n; i++) {
//左侧依次加入String1,String2,...String n
sb[i].append(字符串中下标为i对应的字符即str.charAt(i))
}
for (int i = n - 2; i > 0 ; i--) { // 从下往上所以要倒着来
// 右侧依次加入String1,String2,...String n
sb[i].append(字符串中下标为i对应的字符即str.charAt(i))
}
3、循环红色框框部分即可
int index = 0; //对应字符串的下标
while(index < length){ //length为字符串长度
//循环红色框框部分
}
4、细节
1、如果传入hello,但是行数比字符串长度还大比如1000行,显然结果还是hello。
2、如果传入了null或空,则直接返回null或者空。
3、有这样一种情况:如图。
开始第四次循环红框部分时,此时index=13,满足index<length条件。
如果index=16时,它还在while内部循环,此时str.charAt(index)就会抛出空指针异常!
所以在while内部的for循环也要加上index<length的条件。
4、Java代码
如有意见,多多指出!
public String convert(String text, int nRows) {
if (nRows < 1)
return null;
if (null == text || "".equals(text))
return text ;
if (text.length() <= nRows || nRows == 1)
return text;
char[] chars = text.toCharArray();
int len = chars.length;
StringBuilder[] sb = new StringBuilder[nRows];
for (int i = 0; i < sb.length; i++) {
sb[i] = new StringBuilder();
}
int charIndex = 0;
while (charIndex < len) {
for (int i = 0; i < nRows && charIndex < len; i++) {
sb[i].append(chars[charIndex++]);
}
for (int i = nRows - 2; i > 0 && charIndex < len; i--) {
sb[i].append(chars[charIndex++]);
}
}
StringBuilder res = new StringBuilder();
for (int i = 0; i < sb.length; i++) {
res.append(sb[i]);
}
return res.toString();
}