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字形变换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Visual Studio 2019 如何新建 Win32项目的方法步骤

    Visual Studio 2019 如何新建 Win32项目的方法步骤

    这篇文章主要介绍了Visual Studio 2019 如何新建 Win32项目的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • C++中与输入相关的istream类成员函数简介

    C++中与输入相关的istream类成员函数简介

    这篇文章主要介绍了C++中与输入相关的istream类成员函数简介,包括eof函数和peek函数以及putback函数还有ignore函数,需要的朋友可以参考下
    2015-09-09
  • C++无法打开源文件bits/stdc++.h的问题

    C++无法打开源文件bits/stdc++.h的问题

    这篇文章主要介绍了C++无法打开源文件bits/stdc++.h的问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • C语言不用链表完成学生管理系统(完整代码)

    C语言不用链表完成学生管理系统(完整代码)

    这篇文章主要介绍了C语言不用链表完成学生管理系统(完整代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • C/C++ 实现简易HTTP服务器的示例

    C/C++ 实现简易HTTP服务器的示例

    这篇文章主要介绍了C/C++ 实现简易HTTP服务器的示例,帮助大家更好的理解和学习C/C++编程,感兴趣的朋友可以了解下
    2020-10-10
  • C++ 二叉树的实现超详细解析

    C++ 二叉树的实现超详细解析

    二叉树可以简单理解为对于一个节点来说,最多拥有一个上级节点,同时最多具备左右两个下级节点的数据结构。本文将详细介绍一下C++中二叉树的实现和遍历,需要的可以参考一下
    2022-03-03
  • C语言三个数排列大小的实现方法

    C语言三个数排列大小的实现方法

    下面小编就为大家带来一篇C语言三个数排列大小的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 详解C++编程中类模板的相关使用知识

    详解C++编程中类模板的相关使用知识

    这篇文章主要介绍了详解C++编程中类模板的相关使用知识,包括函数的参数类型替换等方法,需要的朋友可以参考下
    2015-09-09
  • C++基础入门篇之强制转换

    C++基础入门篇之强制转换

    这篇文章主要给大家介绍了关于C++基础入门篇之强制转换的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • C++ 非递归实现二叉树的前中后序遍历

    C++ 非递归实现二叉树的前中后序遍历

    本文将结合动画和代码演示如何通过C++ 非递归实现二叉树的前中后序的遍历,代码具有一定的价值,感兴趣的同学可以学习一下
    2021-11-11

最新评论