执行时间和内存消耗都有点捞,但是好歹做出来了
思路:
理解题意后可知Z是竖着的,可能N更合适一点,从上到下从左到右把字符串按要求排列,第一下想到的是数组,观察后可发现可以把它分为一竖一斜线的重复执行,且每条竖线开始的下标有迹可循,每次开头所要遍历的字符个数也是相同的(除了最后一次可能不完整)。
每一个圈为一次循环,上面是原数组遍历个数,下面是新数组每次循环下标增加的值,还有定义二维数组时列数为字符串长度一半+numRows-1
,为了保证每个元素都能被遍历到,for循环在字符串长度的基础上加了一个循环的长度,但这样会导致字符串被遍历完时for循环还没完成的情况,所以在需要的地方加上循环退出条件
public String convert(String s, int numRows) {
char[][] newChar = new char[numRows][s.length()/2 + numRows-1];
char[] num = s.toCharArray();
int i,count = 0;//新数组下标与字符串计数符
if (num.length == 1 || numRows == 1)
return s;
for (i = 0; i < num.length + 2*(numRows-1); i += numRows-1) {
if (count < num.length) {
for ( int j = 0; j < numRows; j++) {
if (count == num.length) break;
newChar[j][i] = num[count++];
}
if (count == num.length) break;//防止溢出
int k = i+1;
for (int j = numRows-2; j > 0; j--) {
if (count == num.length) break;//防止溢出
newChar[j][k++] = num[count++];
}
}
else break;
}
String ans = "";
for (int j = 0; j < numRows; j++) {
for (int k = 0; k < s.length()/2 + numRows-1; k++) {
if (newChar[j][k] != 0) {
ans += newChar[j][k];
}
}
}
return ans;
}
发现优质代码,只用了所给行数空间的一维数组操作数据,判断正序还是逆序然后下标+1/-1将被遍历到的元素连接到数组当中,最后将每格都连起来统一输出
public String convert(String s, int numRows) {
if(numRows==1)
return s;
String result[]=new String[numRows];
for(int i=0;i<result.length;i++){
result[i]="";//这里一定要初始化,如果不初始化的话,默认是null
}
boolean isDown=false;
int index=0;
for(int i=0;i<s.length();i++){
result[index]+=s.charAt(i);
if(index==0||index==numRows-1){
isDown=!isDown;//第一次index=0时,isDown修改为true说明可以继续往下走;当index=numRows的时候说明不能继续往下走,然后把isDown修改为false
}
index+=isDown?1:-1;
}
StringBuffer sb=new StringBuffer();
for(int i=0;i<result.length;i++){
sb.append(result[i]);
}
return sb.toString();
}