龙空技术网

leetcode题解系列-005 Z字形变换

第一路痴索隆 32

前言:

此时你们对“z变换c语言”大约比较注意,兄弟们都需要剖析一些“z变换c语言”的相关知识。那么小编同时在网摘上收集了一些对于“z变换c语言””的相关知识,希望朋友们能喜欢,你们一起来学习一下吧!

老规矩,先上代码:

//// Created by tannzh on 2020/6/12.///* * Z 字形变换将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:L   C   I   RE T O E S I I GE   D   H   N之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);示例 1:输入: s = "LEETCODEISHIRING", numRows = 3输出: "LCIRETOESIIGEDHN"示例 2:输入: s = "LEETCODEISHIRING", numRows = 4输出: "LDREOEIIECIHNTSG"解释:L     D     RE   O E   I IE C   I H   NT     S     G */#include <string>#include <iostream>#include <vector>#include <numeric>using namespace std;class Solution {public:    string convert(string s, int numRows) {        if(s.empty() || numRows < 2) return s;        std::vector<string> ret(numRows);        for(auto i = 0; i < s.size(); ++i){            int m = i%(numRows-1), n = i/(numRows-1);            (n & 0x1 ? ret[numRows-m-1] : ret[m]) += s[i];        }        return std::accumulate(ret.cbegin(), ret.cend(), string());    }};int main(int argc, char **argv){    Solution s;    std::string test = "LEETCODEISHIRING";    int nRows = 4;    std::cout << "result = " << s.convert(test, nRows) << std::endl;    return 0;}
解题思路

此题目是典型的读起来吓人,却实现超级简单的题目。

这道题为了效率,肯定希望在一次迭代中完成对字符串的分组。而经过简单的分析,可以发现迭代的索引与分组的索引有非常规律的对应关系。

- 对(nRows-1)取余,可以区分行数。- 对(nRows-1)做除,可以区分当前是上升还是下降(偶数上升,奇数下降)。

主要策略就是这样了。代码总共五行。

标签: #z变换c语言