首页 > 其他分享 >2024.09.22 力扣刷题 Z字形变换

2024.09.22 力扣刷题 Z字形变换

时间:2024-09-22 10:35:10浏览次数:1  
标签:index 22 nums int 间隔 2024.09 numRows 力扣 row

题目:

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);

示例 1:
输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"

示例 2:
输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P I N
A L S I G
Y A H R
P I

示例 3:
输入:s = "A", numRows = 1
输出:"A"

上面就是题目的内容,难度标注的是中等,拿到题目读了有一会儿,刚开始不是很懂,后面看了示例大概明白了一些。
我当时的第一反应是进行字符串抽点,Z形应该是有规律可以找的,我设置了row = 3,4,5分别进行了规律查找:
当row = 3时,输入“PAYPALISHIRING”,通过观察Z形,可以看到下标0的P到A时需要有3个字符间隔,下标为1的A到P有1个字符间隔,到Y到I的字符间隔和第1个P到A的字符间隔一致。

但是需要注意的是,当row = 4或5时,其字符间隔会发生变化且数值有两种可能。如下所示(row = 4):

A到L的字符间隔数和L到S的字符间隔数会发生变化,且只有两种情况。

按此推论,从row = 3,4,5的情况下的字符排布,得出各行到下一个字符的间隔数遵循下述规律:
nums=2*(row-1-index)-1;
nums是字符间隔数,row是输入的行数,index是要拼接的每行的下标(若row=6,那么index=[0,5])
当row=4:
index=0,nums=5
index=1,nums=3
index=2,nums=1
index=3,nums=5(同index=0的情况)
也就是说index=0的P到I,中间需要跨5个字符,index=1的A到L需要跨3个字符,但是L到S需要跨1个字符,所以当row为偶数时,需要前后对称构成一组进行遍历,当row为奇数时,中间的index只需要按自己的nums进行遍历。

我提交的代码如下:

class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows == 1)
            return s;
        int* index = new int[numRows]{};
        for (int i = 0; i < (numRows % 2 == 0 ? numRows / 2 : numRows / 2 + 1); ++i) {
            if (i == (numRows - 1 - i)) {
                index[i] = 2 * (numRows - 1 - i) - 1;
            }
            else {
                index[i]= 2 * (numRows - 1 - i) - 1;
                index[numRows -1-i]= i == 0 ? index[i] : 2 * (numRows - 1 - (numRows - 1 - i)) - 1;
            }
        }

        int now_index = 0;
        std::string output;
        for (int i = 0; i < numRows; ++i) {
            now_index = i;
            std::string temp;
            bool flag = true;
            int a = index[i] + 1;
            int b = index[numRows - 1 - i] + 1;
            while (now_index < s.length()) {
                temp += s[now_index];
                now_index += flag ? a : b;
                flag = !flag;
            }
            output += temp;
        }
        delete[] index;

        return output;
    }
};

结果如下:

标签:index,22,nums,int,间隔,2024.09,numRows,力扣,row
From: https://www.cnblogs.com/zjbn/p/18424996

相关文章

  • 【数据结构-差分】【hard】力扣995. K 连续位的最小翻转次数
    给定一个二进制数组nums和一个整数k。k位翻转就是从nums中选择一个长度为k的子数组,同时把子数组中的每一个0都改成1,把子数组中的每一个1都改成0。返回数组中不存在0所需的最小k位翻转次数。如果不可能,则返回-1。子数组是数组的连续部分。示......
  • 【Python爬虫系列】_022.异步文件操作aiofiles
    课程推荐我的个人主页:......
  • 【力扣 | SQL题 | 每日三题】力扣175, 176, 181
    1.力扣175:组合两个表1.1题目:表: Person+-------------+---------+|列名|类型|+-------------+---------+|PersonId|int||FirstName|varchar||LastName|varchar|+-------------+---------+personId是该表的主键(具有唯一......
  • 【数据结构与算法 | 灵神题单 | 栈基础篇】力扣1441, 844, 682
    1.力扣1441:用栈操作构建数组1.1题目:给你一个数组 target 和一个整数 n。每次迭代,需要从  list={1,2,3...,n} 中依次读取一个数字。请使用下述操作来构建目标数组 target :"Push":从 list 中读取一个新元素,并将其推入数组中。"Pop":删除数组中的最后一......
  • ubuntu22.04编译安装R4.4.1
    1.卸载当前版本的R:为了确保之前安装的R版本不会干扰,先卸载它:sudorm-rf/opt/R/4.4.1sudorm/usr/local/bin/Rsudorm/usr/local/bin/Rscript2.安装所需依赖:确保编译R所需的依赖已经安装:sudoapt-getupdate&&\sudoapt-getinstall-ybuild-essentialli......
  • 中国能源发展报告2022
    中国能源发展报告2022林伯强高耗能产业的出路高耗能产业布局:08年,东高西低>>08年之后,西高东低,自南向北移动,东减西增;转移趋势北部沿海城市-河北,山东,2012-2017高耗能产业流入下降,去产能;2009提出中部崛起战略,通过促进中部地区的制造业和城市化促进经济的增长,大量高......
  • 力扣最热一百题——除自身以外数组的乘积
    目录题目链接:238.除自身以外数组的乘积-力扣(LeetCode)题目描述示例提示:解法一:左右数组(小型动态规划)实现思路Java写法:运行时间C++写法:运行时间时间复杂度以及空间复杂度总结题目链接:238.除自身以外数组的乘积-力扣(LeetCode)注:下述题目描述和示例均来自力扣......
  • 力扣最热一百题——搜索二维矩阵
    目录题目链接:240.搜索二维矩阵II-力扣(LeetCode)题目描述解法一:暴力不解释Java写法:运行时间C++写法:运行时间时间复杂度以及空间复杂度 解法二:利用自带的大小关系进行Z型走位Java写法:运行时间C++写法运行时间时间复杂度以及空间复杂度总结题目链接:240.......
  • 【2024潇湘夜雨】WIN10_Pro_22H2.19045.4955软件选装纯净特别版9.20
    【系统简介】=============================================================1.本次更新母盘来自WIN10_Pro_22H2.19045.4955.2.全程离线精简、无人值守调用优化处理制作。部分优化适配系统可能要重启几次,即使显示适配失败也不要在意,可能部分优化不适用。3.OS版本号为19045.4955。......
  • 【力扣20】有效的括号
    20.有效的括号-力扣(LeetCode)括号序列压入栈中,遇到匹配的出栈,最后判断栈是否为空直接使用栈的数据结构stack。classSolution{public:boolisValid(strings){stack<char>stk;//初始化栈for(autoc:s){//入栈if(c=='......