题目
路漫漫其修远兮,刷题还得要用心(呜呜呜~)
由题意可知,这道题的意思是将所给的字符串转化为“Z”字形,然后每行从左到右读取并返回,刚开始准备用的是二维数组根据题意模拟,但是做了一会儿感觉很复杂,在这里提供一种简单且时间复杂度为o(n)的方法:
由题意可知,"z"字形有numRows行,所以我们可以根据“Z”字形的递增、递减规律,用字符数组S1[j]分别存放,每一行的字符串的值,然后将每行字符串的值累加并返回即可,即下图,以“ABCDEFG"和3行为例:
S1数组记录每一行的值,最后return=s1[0]+s1[1]+s1[2],即可。
①:打印”Z“字形,字符数组的下标是首先从0递增numRos-1,再从 numRos-1递减到0,依次按照这个规律变化下去,即首先定义一个string s1,来保存每行的字符串的值;
②:初始化中间变量flag=-1,用flag来表示每次的逐一递增与逐一递减,若(j== 0 || j == numRos-1),flag=-flag,对flag经行变号处理;
③:用变量j=0,进行每一行的计数处理,j的范围[0,numRos-1];
④:注意特殊例子的考虑:若原字符串的个数<2 || numRos == 1,都返回原字符串本身,即return s;(刚开就是没注意numRos==1的条件,调试了半天,真的划不来)。
class Solution {
public:
string convert(string s, int numRows) {
string res;
vector<string>s1(numRows);//建立动态字符数组
int len=s.size();
if(len<2 || numRows==1)
return s;
int flag=-1,j=0;
for(int i=0;i<len;i++)//遍历原来的字符串
{
s1[j]+=s[i];
if(j==0 || j==numRows-1)//经行是否变号的判断
flag=-flag;
j+=flag;
}
for(int i=1;i<numRows;i++)//将所有字符串储存在s1[0]中,最后返回s1[0]即可!
{
s1[0]+=s1[i];
}
return s1[0];
}
};
总结
这个题还是很考验思维的,如果用二维数组去做的话,模拟的过程是比较复杂的,而用这种方法的话,关键在于能否想到用flag=-flag,做中间”Z"字形变化规律的中间过渡,还有就是注意一些特殊例子的判断!当然本篇题解若有不足之处,还望大佬指出错误之处!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)