首页 > 编程语言 >力扣第6题:Z字形变换 交替V和Λ规律法(C++)

力扣第6题:Z字形变换 交替V和Λ规律法(C++)

时间:2024-07-06 22:27:04浏览次数:22  
标签:std numRows return 字形 int C++ next 力扣 string

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:

P   A   H   N
A P L S I I G
Y   I   R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"

示例 :

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

思路
在线性时间内用找规律快速求解

解题方法
对于一个Z型

我们画V字时,坐标移动长度=(2numRows-1)-2(i+1)+1 (最大V字的长度-缩短的长度+(当前在i位置不算))
同样的,可以发现画Λ时坐标移动2i的长度
我们利用两层循环逐层求解即可,外层循环表示当前层,内层循环交替变换A和Λ(注意i==0始终为V和inumRows-1始终为Λ,两种情况不变换)注意numRows==1时直接跳出 否则V字移动会死循环
关流后实测击败全世界

Code

static auto x = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);
    return 0;
}();
class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows==1)return s;
        string ans((int)s.size(),0);
        int si=0;
        for (int i = 0; i < numRows; i++)
        for (int j = i, next = 1; j < s.size(); next = !next) {
            ans[si++]=s[j];
            if (i == 0) { j += numRows * 2 - 2 - i * 2; continue; }
            else if (i == numRows - 1) { j += i * 2; continue; }
            if (next) j += numRows * 2 - 2 - i * 2;
            else if(!next)j += i * 2;
        }
        return ans;
    }
};

标签:std,numRows,return,字形,int,C++,next,力扣,string
From: https://blog.csdn.net/dakingffo/article/details/140138667

相关文章

  • 【C++干货基地】C++模板深度解析:进阶技巧与高级特性掌握(按需实例化、全特化与偏特化)文
    ......
  • c++所有头文件.h
    代码:(包括c++12的非标准头文件)#ifndef_EW_H_#define_EW_H_#include<tchar.h>#include<synchapi.h>#include<algorithm>#include<bitset>#include<cctype>#include<cerrno>#include<clocale>#include<cmath>#inc......
  • windows下C++配置googletest过程记录
    文章目录下载googletest将googletest解压到项目目录并创建build文件夹编译googletest在项目的CMakeLists.txt文件中添加相关依赖编写测试并执行参考下载googletestReleasev1.14.0·google/googletest·GitHub将googletest解压到项目目录并创建build文件夹在g......
  • C++初学者指南-4.诊断---用gdb调试
    C++初学者指南-4.诊断—用gdb调试幻灯片gdb/前端gdbGNU的命令行调试器cgdb基于终端的gdb前端Linux安装:sudoapt-getinstallcgdbgdbgui基于浏览器的gdb前端网址:https://gdbgui.com/安装:sudopipinstallgdbguiQtCreator可以连接gdbVisualStudioCode可以连接gdbV......
  • C++初学者指南-3.自定义类型(第一部分)-异常
    C++初学者指南-3.自定义类型(第一部分)-异常文章目录C++初学者指南-3.自定义类型(第一部分)-异常简介什么是异常?第一个示例用途:报告违反规则的行为异常的替代方案标准库异常处理问题和保证资源泄露使用RAII避免内存泄漏!析构函数:不要让异常逃脱!异常保证无抛出异常保......
  • C++(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例
    C++(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例目录C++(Qt)-GIS开发-QGraphicsView显示瓦片地图简单示例1、概述2、实现效果3、主要代码4、源码地址更多精彩内容......
  • c++ u7-02-高精度乘法
    本节课作业:链接:https://pan.baidu.com/s/13-FC86jSHGziRDA8lqzimg?pwd=owv1提取码:owv1   高精度乘法             #include<iostream>#include<cstdio>#include<cstring>usingnamespacestd;stringx,y;inta......
  • C++算法实践04-寻找两个正序数组的中位数
    一、题目:给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为 O(log(m+n)) 。示例1:输入:nums1=[1,3],nums2=[2]输出:2.00000解释:合并数组=[1,2,3],中位数2示例2:输入:nu......
  • 使用c++实现图形化文件浏览
       代码中使用了SDL2库,需要先安装并正确配置相关的开发环境。还需要添加字体加载和处理的代码,为图方便,省略。#include<iostream>#include<SDL2/SDL.h>#include<SDL2/SDL_image.h>#include<vector>#include<string>#include<filesystem>constintSCREEN......
  • C++题解(3) 信息学奥赛一本通: 1013:温度表达转化 洛谷:B2013 温度表达转化 土豆编程:M
    【题目描述】利用公式 C=5×(F−32)÷9C=5×(F−32)÷9(其中CC表示摄氏温度,FF表示华氏温度)进行计算转化,输入华氏温度FF,输出摄氏温度CC,要求精确到小数点后55位。【输入】输入一行,包含一个实数FF,表示华氏温度。(F≥−459.67)(F≥−459.67)【输出】输出一行,包含一个......