LeetCode-第五天

又是打卡的一天!!!

题外话开头,唉,我弟高考成绩太不理想了,家里人也正在纠结要不要去复读,所以说平时不努力,出结果的时候真的太难受了!!!!
今天的题目,这段时间忙着家里的事情,晚上就只能写一题了,等以后事情结束,争取每天晚上五题起步!!!

题目描述

在这里插入图片描述在这里插入图片描述

当前解法

这个题目刚开始理解起来属实有点困难,好在题目给出了两个实例,辅助理解。大概意思就是说,将字符串按照倒置的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时,输出结果就和源代码一样,无须处理,看一下运行结果

运行结果

在这里插入图片描述
这个运行结果相对来说还是比较满意,毕竟是没有优化的结果!!!

好了,今天的题目就到这叭,有点晚了,该睡觉了!!!

晚安!!!!!!

继续加油!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值