本文主要是介绍第六题:Z字形变换(Zigzag Conversion),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述:
将给定的字符串 s
以指定的行数 numRows
进行“Z字形”排列,然后按行读出字符串并返回。
示例:
-
输入:
s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"
-
输入:
s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
要求: 你需要将字符串 s
按照 numRows
行的Z字形排列,并返回按行读取的结果。
解题思路
方法1:模拟
-
特殊情况处理:
- 当
numRows
为 1 时,直接返回字符串,因为没有Z字形效果。
- 当
-
创建一个数组:
- 创建一个二维数组
rows
,用于存放每行的字符。
- 创建一个二维数组
-
模拟遍历:
- 使用一个变量
currentRow
来记录当前行,另一个变量goingDown
来指示是否需要向下移动行数。 - 遍历字符串中的每个字符,根据
goingDown
的状态决定是向下还是向上移动。
- 使用一个变量
-
构建结果:
- 遍历二维数组,将每行的字符拼接成结果字符串。
C 语言实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>char* convert(char* s, int numRows) {int len = strlen(s);if (numRows == 1 || numRows >= len) return s;char** rows = (char**)malloc(numRows * sizeof(char*));for (int i = 0; i < numRows; i++) {rows[i] = (char*)malloc((len + 1) * sizeof(char));rows[i][0] = '\0';}int currentRow = 0;int goingDown = 0;for (int i = 0; i < len; i++) {strcat(rows[currentRow], (char[]){s[i], '\0'});if (currentRow == 0 || currentRow == numRows - 1) goingDown = !goingDown;currentRow += goingDown ? 1 : -1;}char* result = (char*)malloc((len + 1) * sizeof(char));result[0] = '\0';for (int i = 0; i < numRows; i++) {strcat(result, rows[i]);free(rows[i]);}free(rows);return result;
}
Java 实现
public class Solution {public String convert(String s, int numRows) {if (numRows == 1 || numRows >= s.length()) return s;StringBuilder[] rows = new StringBuilder[numRows];for (int i = 0; i < numRows; i++) {rows[i] = new StringBuilder();}int currentRow = 0;boolean goingDown = false;for (char c : s.toCharArray()) {rows[currentRow].append(c);if (currentRow == 0 || currentRow == numRows - 1) {goingDown = !goingDown;}currentRow += goingDown ? 1 : -1;}StringBuilder result = new StringBuilder();for (StringBuilder row : rows) {result.append(row);}return result.toString();}
}
Python 实现
def convert(s: str, numRows: int) -> str:if numRows == 1 or numRows >= len(s):return srows = [''] * numRowscurrentRow = 0goingDown = Falsefor char in s:rows[currentRow] += charif currentRow == 0 or currentRow == numRows - 1:goingDown = not goingDowncurrentRow += 1 if goingDown else -1return ''.join(rows)
时间复杂度
时间复杂度: 所有这些实现方法的时间复杂度为 (O(n)),其中 (n) 是字符串 s
的长度。由于每个字符都被访问一次,时间复杂度是线性的。
空间复杂度: 空间复杂度为 (O(n)) 来存储最终的结果和各行的字符。对于每个字符,我们都需要一个地方来存储,所以总体空间复杂度是线性的。
这篇关于第六题:Z字形变换(Zigzag Conversion)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!