百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

LeetCode高频算法面试题 - 006 - Z字形变换

toyiye 2024-07-06 00:22 16 浏览 0 评论

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

提示:

1 <= s.length <= 1000
s 由英文字母(小写和大写)、',' 和 '.' 组成
1 <= numRows <= 1000

#代码实现

tips: 以下代码是使用Go代码实现的不同解法, 文章最后可以看C++、C、Java、Python实现

解题思路:

可以根据官方给的实例为例,比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时

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

每满 行数-1 (numRows-1) 可以为一组,因为字符串每第numRows个元素是Z形字符串的方向转折点。

如上图

分组: LE   ET  CO   DE ...等等为一组,
组数: 0    1   2    3
顺序: 正序 倒序 正序  倒序...

important: 当组数为偶数时给数组(strArr)正序赋值,当组数为奇数时数组(strArr)倒序赋值即可。

func convert(s string, numRows int) string {
  if numRows == 1 {
    return s
  }

  b := numRows - 1
  strArr := make([]string, numRows)
  for k, v := range s {
    if (k/b)%2 == 0 { // 组数是偶数
      strArr[k%b] += string(v) // 数组(`strArr`)正序赋值
    } else {
      strArr[b-(k%b)] += string(v) // 数组(`strArr`)倒序赋值
    }
  }
  return strings.Join(strArr,"")
}

执行结果分析:

时间复杂度: O(n)
空间复杂度: O(n)

#其他版本的语言实现

1、Python3

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

算法思路:

  • i 初始化 为0, flag = -1
  • res[i] += c, 将遍历每个字符 放入对应的行中
  • i += flag, 更新当前字符c 的所在的数组索引
  • important: 引入一个flag, 初始化=-1, 当达到Z字形顶点, 方向反转 flag=-flag.
class Solution:
    def convert(self, s: str, numRows: int) -> str:
        if numRows < 2: return s
        res = ["" for _ in range(numRows)]
        i, flag = 0, -1
        for c in s:
            res[i] += c
            if i == 0 or i == numRows - 1: flag = -flag
            i += flag
        return "".join(res)

2、Java

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

算法思路和上面的Python3的思路一样:

  • i 初始化 为0, flag = -1
  • res[i] += c, 将遍历每个字符 放入对应的行中
  • i += flag, 更新当前字符c 的所在的数组索引
  • important: 引入一个flag, 初始化=-1, 当达到Z字形顶点, 方向反转 flag=-flag.
class Solution {
    public String convert(String s, int numRows) {
        if(numRows < 2) return s;
        List<StringBuilder> rows = new ArrayList<StringBuilder>();
        for(int i = 0; i < numRows; i++) rows.add(new StringBuilder());
        int i = 0, flag = -1;
        for(char c : s.toCharArray()) {
            rows.get(i).append(c);
            if(i == 0 || i == numRows -1) flag = - flag;
            i += flag;
        }
        StringBuilder res = new StringBuilder();
        for(StringBuilder row : rows) res.append(row);
        return res.toString();
    }
}

3、C++

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

算法思路和上面的Python3的思路一样:

  • i 初始化 为0, flag = -1
  • res[i] += c, 将遍历每个字符 放入对应的行中
  • i += flag, 更新当前字符c 的所在的数组索引
  • important: 引入一个flag, 初始化=-1, 当达到Z字形顶点, 方向反转 flag=-flag.
class Solution {
public:
  string convert(string s, int numRows) {

    if (numRows == 1) return s;

    vector<string> res(min(numRows, int(s.size()))); // 防止s的长度小于行数
    int i = 0;
    int flag = -1;

    for (char c : s) {
      res[i] += c;
      if (i == 0 || i == numRows - 1) {// 当前行i为0或numRows -1时,flag发生反向转折
        flag = -flag;
      }
      i += flag;
    }

    string ret;
    for (string row : res) {// 从上到下遍历行
      ret += row;
    }

    return ret;
  }
};

#几种语言运行效果对比

Go程序在内存方面表现最佳, Python在内存和运行时间表现 比较其他的语言都比较差。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码