Leetcode 热题HOT 100 6.Z字形变换(C++)

Leetcode 热题HOT 100 6.Z字形变换(C++),第1张

Leetclass="superseo">code 热题HOT 100 6.Z字形变换
题目


路漫漫其修远兮,刷题还得要用心(呜呜呜~)

一、解题思路

由题意可知,这道题的意思是将所给的字符串转化为“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的条件,调试了半天,真的划不来)。

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"字形变化规律的中间过渡,还有就是注意一些特殊例子的判断!当然本篇题解若有不足之处,还望大佬指出错误之处!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/722195.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存