C++实现LeetCode(6.字型转换字符串)

这篇文章主要介绍了C++实现LeetCode(6.字型转换字符串),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

C++实现LeetCode(6.字型转换字符串),恰卡网带你了解更多相关信息。

[LeetCode] 6. 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

And then read line by line: \”PAHNAPLSIIGYIR\”

Write the code that will take a string and make this conversion given a number of rows:

string convert(string s, int numRows);

Example 1:

Input: s = \”PAYPALISHIRING\”, numRows = 3
Output: \”PAHNAPLSIIGYIR\”

Example 2:

Input: s = \”PAYPALISHIRING\”, numRows = 4
Output: \”PINALSIGYAHRPI\”
Explanation:

P     I    N
A   L S  I G
Y A   H R
P     I

这道题刚开始看了半天没看懂是咋样变换的,上网查了些资料,终于搞懂了,就是要把字符串摆成一个之字型的,比如有一个字符串 \”0123456789ABCDEF\”,转为 zigzag 如下所示:

当 n = 2 时:

0 2 4 6 8 A C E

1 3 5 7 9 B D F

当 n = 3 时:

0   4    8     C

1 3 5 7 9 B D F

2    6   A     E

当 n = 4 时:

0     6        C

1   5 7   B  D

2 4   8 A    E

3      9       F

可以发现,除了第一行和最后一行没有中间形成之字型的数字外,其他都有,而首位两行中相邻两个元素的 index 之差跟行数是相关的,为  2*nRows – 2, 根据这个特点,可以按顺序找到所有的黑色元素在元字符串的位置,将他们按顺序加到新字符串里面。对于红色元素出现的位置(Github 上可能无法正常显示颜色,请参见博客园上的帖子)也是有规律的,每个红色元素的位置为 j + 2 x numRows-2 – 2 x i, 其中,j为前一个黑色元素的 index,i为当前行数。 比如当 n = 4 中的那个红色5,它的位置为 1 + 2 x 4-2 – 2 x 1 = 5,为原字符串的正确位置。知道了所有黑色元素和红色元素位置的正确算法,就可以一次性的把它们按顺序都加到新的字符串里面。代码如下:

解法一:

class Solution {public:    string convert(string s, int numRows) {        if (numRows <= 1) return s;        string res;        int size = 2 * numRows - 2, n = s.size();        for (int i = 0; i < numRows; ++i) {            for (int j = i; j < n; j += size) {                res += s[j];                int pos = j + size - 2 * i;                if (i != 0 && i != numRows - 1 && pos < n) res += s[pos];            }        }        return res;    }};

若上面解法中的规律不是很好想的话,我们也可以用下面这种更直接的方法来做,建立一个大小为 numRows 的字符串数组,为的就是把之字形的数组整个存进去,然后再把每一行的字符拼接起来,就是想要的结果了。顺序就是按列进行遍历,首先前 numRows 个字符就是按顺序存在每行的第一个位置,然后就是 ‘之\’ 字形的连接位置了,可以发现其实都是在行数区间 [1, numRows-2] 内,只要按顺序去取字符就可以了,最后把每行都拼接起来即为所求,参见代码如下:

解法二:

class Solution {public:    string convert(string s, int numRows) {        if (numRows <= 1) return s;        string res;        int i = 0, n = s.size();        vector<string> vec(numRows);        while (i < n) {            for (int pos = 0; pos < numRows && i < n; ++pos) {                vec[pos] += s[i++];            }            for (int pos = numRows - 2; pos >= 1 && i < n; --pos) {                vec[pos] += s[i++];            }        }        for (auto &a : vec) res += a;        return res;    }};

到此这篇关于C++实现LeetCode(6.字型转换字符串)的文章就介绍到这了,更多相关C++实现字型转换字符串内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/2106.html

(0)
上一篇 2021-07-10 01:45:18
下一篇 2021-07-10 01:45:20

相关推荐

  • 龙芯:虚幻引擎4已成功移植(还将移植虚幻引擎5)

    今日,龙芯中科宣布,近期,虚幻引擎4成功移植到龙芯3A5000平台,标志着LoongArch生态建设向游戏数字领域迈出坚实一步。作为一款殿堂级的游戏引擎,虚幻引擎提供了游戏开发者需要的大量核心技

    2021-08-31
    2600
  • 五大联赛为什么只有英超叫超(中超为什么叫超级联赛)

    五大联赛为什么只有英超叫超,中超为什么叫超级联赛 内容导航: 世界十大足球俱乐部!明星球员大都来自这里! 英超为什么在欧洲五大联赛里叫“超级联赛” 五大联赛为什么单英超叫超别的都叫…

    2022-12-23
    40
  • 站长统计有什么用(站长统计是啥)

    站长统计有什么用,站长统计是啥内容导航:cnzz站长统计有什么功能啊怎么用站长统计是什么意思网站下面的cnzz站长统计是什么意思YAHOO在统计流量是不是也把站长自己统计进了一、cnzz站长统计有什么功能啊怎么用通过CNZZ站长统计,站长可以随时知道自己网站的被访问情况,每天多少人看了哪些网页,新访

    2022-04-17
    1.0K0
  • 什么是日升期域名(域名是什么)

    什么是日升期域名,域名是什么内容导航:日升期是什么意思域名日升期什么意思域名日升期是什么意思呢什么是域名注册的“日出期”一、日升期是什么意思域名的日升期(Sunrise),是域名机构开放注册的四个时期(日升期,抢滩期,预注册期,公众注册

    2022-04-25
    1050
  • 同居1年以上的女生能要吗(同居一年以上是事实婚姻吗)

    在谈恋爱过程中,很多情侣谈的比较稳定后都会选择同居,同居几年后分手的情侣也有很多,但这并不影响这个女生人品的好坏,如果作为一个男生嫌弃对方同居过,比较在意的话,那就不要开始第一步。同居1年以上的女生能要吗1、这就看你了,

    2021-12-21
    2240
  • 如何通过照片查出地址(苹果手机识别对方图片位置)

    如何通过照片查出地址(苹果手机识别对方图片位置)要点:——为什么要打开“隐私”项下的相机“定位服务”?——如何打开“隐私”项下的相机“定位服务”?——如何获取照片位置信息?正文:使用iPhone相机拍摄时,按需在“相机”界面设置、选取对应的

    2021-11-28 热点头条
    1.1K0

发表回复

登录后才能评论