Z 字形变换(字符串)

题目

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

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

L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

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

示例 2:
输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:

L D R
E O E I I
E C I H N
T S G

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

代码1.

纯暴力写出来了,贴个代码算了0.0

class Solution {
public:
    string convert(string s, int numRows)
    {
        if (numRows == 1)
            return s;
        int num = 0, m = 0, p = 1, j = 0;
        char arr[1000][1000];
        string str;
        for (int i = 0; i < 1000; i++)
        {
            for (int j = 0; j < 1000; j++)
            {
                arr[i][j] = NULL;
            }
        }
        for (int i = 0; num < s.size(); i++)
        {
            for (j = 0; j < numRows && num < s.size(); j++)
            {
                if (i == 0 || i == m + numRows - 1)
                {
                    m = i;
                    for (j = 0; j < numRows && num < s.size(); j++)
                    {
                        arr[j][i] = s[num];
                        num++;
                    }
                    p = 0;
                    continue;
                }
                else
                {
                    if (j != numRows - 1 && arr[j + 1][i - 1] != NULL)
                    {
                        if (i != m + 1 && i != 1)
                        {
                            arr[j][i] = s[num];
                            p = 0;
                            num++;
                            continue;
                        }
                        else
                        {
                            j = numRows - 2;
                            arr[j][i] = s[num];
                            i++;
                            j = -1;
                            num++;
                            continue;
                        }
                    }
                }
            }
        }
        for (int i = 0; i < s.size() && str.size() != s.size(); i++)
        {
            for (int j = 0; j < s.size() && str.size() != s.size(); j++)
            {
                if (arr[i][j] >= 41 && arr[i][j] <= 176)
                {
                    str += arr[i][j];
                }
            }
        }
        return str;
    }
};
代码2

1.res[i] += c: 把每个字符 c 填入对应行 s i;
2.i += flag: 更新当前字符 c 对应的行索引;
3.flag = - flag: 在达到 Z 字形转折点时,执行反向

把每一行放到一个字符串数组里面,利用flag就行上下控制。比我那菜鸡算法好太多了

class Solution {
public:
    string convert(string s, int numRows)
    {
        if (numRows == 1) {
            return s;
        }
        string str[1000];
        int i = 0, flag = 1, num = 0;
        while (num < s.size())
        {

            str[i] += s[num];
            i += flag;
            if (i >= numRows)
            {
                flag = -flag;
                i += flag;
                i += flag;
            }
            if (i < 0)
            {
                flag = -flag;
                i += flag;
                i += flag;
            }
            num++;
        }
        s = "";
        for (i = 0; i < numRows; i++) {
            s += str[i];
        }
        return s;
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这是DS小龙哥编写整理的,Python3入门指南.pdf,总共10章,可以当做入门书籍、平时的参考书籍,文中代码都可以复制粘贴。后续资源包会持续更新。 这是书籍的目录 编辑: DS小龙哥 1 Python3入门指南 1 一、 Python编程语言入门介绍 1 1.1 什么是Python? 1 1.2 Python与其他编程语言的比较 1 二、搭建Python开发环境 2 2.1 Python版本介绍 2 2.2 在windows下安装Python环境 2 2.3 在ubuntu18.04环境下安装Python环境 5 2.4 运行Python代码方式 8 2.4 编写Python推荐的编辑器 9 2.5 windows下安装VSCode代码编辑器 11 2.6 ubuntu下安装VSCode代码编辑器 22 三、Python基础语法学习 30 3.1 编写第一个Python程序 30 3.2 Python中单行与多行注释语法 31 3.3 python输出功能基本语法:print() 32 3.4 python输入功能基本语法:input() 34 3.5 Python标识符与关键字 34 3.6 Python代码缩进规则 35 3.7 文本编码 36 四、Python变量、数据类型 38 4.1 Python数据类型介绍 38 4.2 变量的概念与赋值方法 38 4.3 Python数字数据类型 41 4.4 Python字符串类型 42 4.5 Python字符串处理 44 4.6 Python列表数据类型 48 4.7 Python元组数据类型 56 4.8 Python字典数据类型 58 4.9 Python集合数据类型 66 五、Python运算符 73 5.1 运算符介绍 73 5.2 算术运算符 74 5.3 比较运算符 75 5.4 赋值运算符 77 5.5 位运算符 79 5.6 逻辑运算符 81 5.7 成员运算符 82 5.8 身份运算符 84 5.9 运算符优先级 86 六、Python判断语句与循环语句 87 6.1 if判断语句 87 6.2 while循环语句 89 6.3 for循环语句 92 6.4 break循环控制语句 98 6.5 continue循环控制语句 99 6.6 assert语句 100 七、Python函数 100 7.1 调用函数 101 7.2 定义一个函数 102 7.3 函数参数传递 103 7.4 匿名函数 106 7.5 return语句 107 7.6 关于函数形参可更改与不可更改对象 108 7.7 局部变量与全局变量 109 7.8 局部函数 111 八、Python模块 111 8.1 python中的模块是什么? 112 8.2 导入模块: 学习import语句 112 8.3 编写自定义模块 115 8.4 模块的搜索路径 117 8.5 Python的包 123 8.6 Python第三方库(模块)下载 128 九、文件IO编程 130 9.1 Python文件操作函数介绍 130 9.2 操作文件的一般顺序 130 9.3 Python内置的open函数 131 9.4 操作文件常用的方法 133 9.5 调用操作系统提供的接口函数操作文件 140 9.6 os.path模块常见函数用法 144 9.7 fnmatch模块:用于文件名的匹配 145 9.8 tempfile模块: 生成临时文件和临时目录 146 十、面向对象编程 147 10.1 面向对象程序设计思想 147 10.2 面向对象相关术语 148 10.3 类与对象的基本使用 148 10.4 类封装机制 156 10.5 类继承机制 157 10.6 父类方法重写 159
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值