千家信息网

C++如何实现字型转换字符串

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍"C++如何实现字型转换字符串"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"C++如何实现字型转换字符串"文章能帮助大家解决问题。ZigZag
千家信息网最后更新 2026年11月02日C++如何实现字型转换字符串

这篇文章主要介绍"C++如何实现字型转换字符串"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"C++如何实现字型转换字符串"文章能帮助大家解决问题。

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 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++如何实现字型转换字符串"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

字符 字符串 位置 元素 字型 就是 顺序 红色 C++ 一行 知识 解法 黑色 代码 字形 数组 方法 行业 规律 不同 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海喔噻互联网科技有限公司 广东万易互联网科技有限公司惠州分公司 新华互联网科技 科技股互联网 中资互联网科技 郑州华宇互联网科技 上海亿帐通互联网科技 左右互联网络科技 互联网金融监管科技 卓越科技互联网 招聘 宁波青枫互联网科技有限公司 重庆威客帮互联网科技 互联网5g黑科技有哪些 玉溪互联网科技怎么选 互联网新科技动漫ppt素材 互联网科技圈年度人物 互联网企业科技类企业如何做账 张家口科技产业互联网平台 互联网领先科技成果宣传视频 广州全民伙伴互联网科技有限公司 深圳市人人互联网科技有限公司 河南云网互联网络科技有限公司 互联网 科技公司 广州凡科互联网科技 互联网科技论坛 昭通云南众福互联网科技有限公司 洛阳共同富裕互联网科技有限公司 上海京穆互联网科技有限公司 郑州欣桑互联网科技有限公司 互联网科技职业技能培训学校
0