又是打卡的一天!!!
题外话开头,唉,我弟高考成绩太不理想了,家里人也正在纠结要不要去复读,所以说平时不努力,出结果的时候真的太难受了!!!!
今天的题目,这段时间忙着家里的事情,晚上就只能写一题了,等以后事情结束,争取每天晚上五题起步!!!
题目描述
当前解法
这个题目刚开始理解起来属实有点困难,好在题目给出了两个实例,辅助理解。大概意思就是说,将字符串按照倒置的Z字形其实就是N字形翻一下,排列,然后一行行输出。其实细心一点我们可以发现,这就是小学数学的找规律,只需要找出每一个字符的位置对应的函数,那么这个题目就很简单。我大致将其分了三类:
-
第一行
第一行和最后一行,很明显,他不存在着中间那些列,那么根据规律我们可以知道,将行数设为i的话,大致是i。而这个关键就是每一个倒Z型都是一个递增而已,仅在上一个倒Z型字符位置的基础上加上了2numRows-2,简单的话通过数,我们也能够数出来,其实可以根据行数 numRows2 - 2个重复的交叉点,那么就能算出来。这是第一行的,函数为:(2*numRows-2)*num -
最后一行
最后一行与第一行大致相同,不再赘述,函数为:(2*numRows-2)*num+(numRows-1) -
中间行
中间行相对来说复杂一点,因为他存在着两个数字,但是与第一行和最后一行是一样的他都是倒Z型在递增,那么我们只需要管第一个倒Z型中每个字符的位置,然后加上相应的数即可。在中间行这里,存在着两个,第一个数很简单,函数为:(2*numRows-2)num+i(其中num为倍数,i为行数),而第二个其实好好找,算一下,能够算出函数为:(2numRows-2)num+(2numRows-2-i)
找出函数后就很简单了,废话不多说上代码:
代码
string convert(string s, int numRows) {
if(numRows==1){
return s;
}
int addition =0;
int another_at = 0;
int index = 0;
int num = 0;
int const_num = 2*numRows - 2 ;
string answer ="";
for(int i=0;i<numRows;i++){
if(i==(numRows-1)){
addition = numRows-1;
}
if(i>0&&i<(numRows-1)){
addition = i;
another_at = const_num-i;
}
index = 0;
num =0;
while(true){
index = addition+const_num*num;
if(index > (s.length()-1)){
break;
}
answer += s.at(index);
if(i>0&&i<(numRows-1)){
index = another_at + const_num*num;;
if(index > (s.length()-1)){
break;
}
answer += s.at(index);
}
num++;
}
}
return answer;
}
代码也是根据上面的思路写的,其中唯一要注意的一个点是当行数为1时,实际上是不用往下运行的,因为行数为1时,输出结果就和源代码一样,无须处理,看一下运行结果
运行结果
这个运行结果相对来说还是比较满意,毕竟是没有优化的结果!!!
好了,今天的题目就到这叭,有点晚了,该睡觉了!!!
晚安!!!!!!
继续加油!!!!