C++中的Z字形变换问题

 更新时间:2022年07月09日 08:15:42   作者:ufgnix0802  
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列,这样一个需求怎么实现呢,下面小编给大家带来了C++中的Z字形变换问题,需要的朋友可以参考下

Z字形变换

描述

将一个给定字符串 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字形存在一定规律,每当固定的条件后前进方向进行转变)。

class Solution {
public:
    string convert(string s, int numRows) {
        int rows = numRows;
	    int columns = ((s.length() / (2 * rows - 1)) + 1) * rows;//尽可能缩小所使用的空间,这里columns可优化,并未精确求解
	    std::vector<std::vector<char>> arrs(rows, std::vector<char>(columns));

	    //初始化
	    for (int i = 0; i < rows; i++)
		    for (int j = 0; j < columns; j++)
			    arrs[i][j] = '0';

	    int x = 0, y = 0;
	    int index = 0;
	    while (index < s.length())
	    {
		    if (index < s.length() && x < rows)
			    arrs[x++][y] = s[index++];

		    if (index < s.length() && x == rows)
		    {
                 //更新x和y
			    y++;
			    x -= 2;
			    while (index < s.length() && x > 0)
				    arrs[x--][y++] = s[index++];
			    x = 0;//重置x
		    }
	    }

	    std::string res;
	    for (int i = 0; i < rows; i++)
	    {
		    for (int j = 0; j < columns; j++)
		    {
			    if (arrs[i][j] != '0' && arrs[i][j] != '\0')
				    res.push_back(arrs[i][j]);
		    }
	    }
	    return res;
    }
};

到此这篇关于C++中的Z字形变换的文章就介绍到这了,更多相关C++ Z字形变换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • OpenCV画任意圆弧曲线

    OpenCV画任意圆弧曲线

    这篇文章主要为大家详细介绍了OpenCV画任意圆弧曲线,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • OpenCV实现车牌定位(C++)

    OpenCV实现车牌定位(C++)

    这篇文章主要为大家详细介绍了OpenCV实现车牌定位,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • 详解进程同步与互斥机制

    详解进程同步与互斥机制

    进程同步是一个操作系统级别的概念,是在多道程序的环境下,存在着不同的制约关系,为了协调这种互相制约的关系,实现资源共享和进程协作,从而避免进程之间的冲突,引入了进程同步
    2021-06-06
  • Qt实现栅格布局效果

    Qt实现栅格布局效果

    这篇文章主要为大家详细介绍了Qt实现栅格布局效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 详解C++中四种类型的转换

    详解C++中四种类型的转换

    这篇文章主要是想和大家一起聊聊来C++中的四种类型转换 :const_cast、static_cast、reinterpret_cast和dynamic_cast,感兴趣的可以了解一下
    2022-12-12
  • C语言中const和define的区别你了解嘛

    C语言中const和define的区别你了解嘛

    这篇文章主要为大家详细介绍了C语言中const和define的区别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • CFileDialog的钩子函数解决对话框的多选之DoModal问题

    CFileDialog的钩子函数解决对话框的多选之DoModal问题

    前几天领导问我一个问题:就是使用CFileDialog类在设置多选时选中的文件所放的文件缓冲区不知设置多大合适,本文将详细介绍,需要的朋友可以参考下
    2012-12-12
  • C/C++中的名字空间与作用域示例详解

    C/C++中的名字空间与作用域示例详解

    这篇文章主要给大家介绍了关于C/C++中名字空间与作用域的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c/c++具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧。
    2017-09-09
  • 解析C++中构造函数的默认参数和构造函数的重载

    解析C++中构造函数的默认参数和构造函数的重载

    这篇文章主要介绍了解析C++中构造函数的默认参数和构造函数的重载,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C语言格式化输入输出函数详解

    C语言格式化输入输出函数详解

    本文给大家分享的是c语言中2个格式化输入输出的函数printf()和scanf()的使用方法的说明及其组合方式的表单,非常详细,推荐给大家,希望对大家能够有所帮助。
    2015-03-03

最新评论