听了前辈的建议开始做leetcode上面的题目,因为自己还不太会编程所以先从easy开始。第一个题目挑上了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
因为一开始理解错题目的意思,而且举得例子在我看来有点特殊,所以把行时的情况理解成了下面这样。
A G B E H K C F I L D J做了比较繁琐的编程之后(一开始是推导每个字符从横向改为这种形状后会出现的位置关系公式,然后进行数组和字符串操作,相对繁琐)。上传编译时发现网站测试说我的结果有错,我才真正理解题目的意思。原来ZigZag指的是这种情况,
A G M
B F H L
C E I K
D J
然后在搜索资料时看到了一种很不错的思想。自己理解并转化为JAVA代码后如下
public class Solution {
String convert(String s, int numRows){
if(numRows == 1||s.length()==1) return s; //如果行数或者长度为1,不需要
String[] res = new String[numRows]; //定义转换后的字符串数组,大小为行数即可,每一行可以添加若干个字符(串)
for(int i=0;i<numRows;i++){ //将所有值赋为空字符,否则系统会自动赋值为null,将会影响输出
res[i]="";
}
int i = 0, j, gap = numRows-2;
while(i < s.length()){ //循环主体
for(j = 0; i < s.length() && j < numRows; ++j){ res[j] += s.substring(i, i+1); i=i+1;} //控制一列下来从上到下的循环,将原字符串的值自增的付给新数组的每行中
for(j = gap; i < s.length() && j > 0; --j){ res[j] += s.substring(i, i+1); i=i+1;} //控制斜方向的从下向上的循环,将原字符串的值继续增加给每一行
}
String str = "";
for(i = 0; i < numRows; i++) //返回最后结果
str += res[i];
return str;
}
}
第一道题就感受到了明显的困难和差距,日后之路尚远。