• 算法学习:LeetCode-6. Z 字形变换


    1.题目

    将一个给定字符串 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);

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/zigzag-conversion

    2.解题思路

    1.用二维数组去把字符串S按照“Z”字型排列后,再用一个新的字符串将二维数组中的内容串成一串儿。

    2.如何把S按照“Z”字型排列?

            2.1先确定二维矩阵的shape:

                                            行数就是形参r

                                            列数:“Z”的排列有一定的周期性,周期为t=r+r-2=2r-2

                                                         一个周期占有的列数为1+r-2=r-1

                                                         所以,字符串的占有的列数为t*(r-1)

            2.2 排列

                               设当前填写的位置为 (x,y),初始 (x,y)=(0,0)若当前字符下标 i,i 满足i %t<r-1,则向下移动,否则向右上移动。

    3.代码

    1. class Solution {
    2. public:
    3. string convert(string s, int numRows) {
    4. int n=s.length();
    5. if(numRows==1 || n<numRows){
    6. return s;
    7. }
    8. int t=2*numRows-2;
    9. int c=(n/t+1)*(numRows-1);
    10. vector<string> chars(numRows, string(c, 0));
    11. int x=0,y=0;
    12. for(int i=0;i<n;i++){
    13. if(i%t<numRows-1){
    14. chars[x++][y]=s[i];
    15. }else{
    16. chars[x--][y++]=s[i];
    17. }
    18. }
    19. string ans; //c++有自己的字符串
    20. for(auto &row:chars){//类似java的for循环
    21. for(char ch:row){
    22. if(ch){
    23. ans+=ch;
    24. }
    25. }
    26. }
    27. return ans;
    28. }
    29. };

  • 相关阅读:
    Python中的闭包是怎么回事儿?五分钟看懂。
    Flexible-Job-Shop-Scheduling-Problem解读
    wsl迁移至其他盘
    Java 基础(继承、接口、抽象)
    docker学习第二天
    mysql集群使用nginx配置负载均衡
    计算机毕业设计Python+Django的银行取号排队系统(源码+系统+mysql数据库+Lw文档)
    更改文本文件分隔符
    return语句
    Mysql 45讲学习笔记(三十五)优化join语句
  • 原文地址:https://blog.csdn.net/qq_44635691/article/details/125450589