前言:
此时你们对“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语言