Z 字形变换

宁睿  金牌会员 | 2024-10-17 02:53:14 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 952|帖子 952|积分 2866

题目

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形分列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,分列如下:
  1. P   A   H   N
  2. A P L S I I G
  3. Y   I   R
复制代码
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
请你实现这个将字符串进行指定行数变换的函数:
  1. string convert(string s, int numRows);
复制代码
示例 1:
  1. 输入:s = "PAYPALISHIRING", numRows = 3
  2. 输出:"PAHNAPLSIIGYIR"
复制代码
示例 2:
  1. 输入:s = "PAYPALISHIRING", numRows = 4
  2. 输出:"PINALSIGYAHRPI"
  3. 解释:
  4. P     I    N
  5. A   L S  I G
  6. Y A   H R
  7. P     I
复制代码
示例 3:
  1. 输入:s = "A", numRows = 1
  2. 输出:"A"
复制代码
提示:
1 <= s.length <= 1000

s 由英文字母(小写和大写)、‘,’ 和 ‘.’ 构成

1 <= numRows <= 1000
参考答案

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. class Solution {
  4. public:
  5.     string convert(string s, int numRows) {
  6.         if (numRows <= 1) {
  7.             return s;
  8.         }
  9.         string new_s;
  10.         for (int row = 0; row < numRows; row++) {
  11.             int delta;
  12.             int interval1 = numRows + (numRows - 2) - row * 2;
  13.             int interval2 = 2 * row;
  14.             bool flag = false;
  15.             for (int i = row; i < s.length(); i += delta) {
  16.                 new_s.push_back(s[i]);
  17.                 do {
  18.                     delta = !flag ? interval1 : interval2;
  19.                     flag = !flag;
  20.                 } while (delta == 0);
  21.             }
  22.         }
  23.         return new_str;
  24.     }
  25. };
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

宁睿

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表