题目描述
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
javascript
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。
请你实现这个将字符串进行指定行数变换的函数:
javascript
string convert(string s, int numRows);
示例 1:
输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"
示例 2:
输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
javascript
P I N
A L S I G
Y A H R
P I
示例 3:
输入:s = "A", numRows = 1
输出:"A"
解题思路:
1.行数是固定的
2.写入顺序是固定的,下上下上下上。。。。
3.可不可以遍历s的同时,控制上下顺序,写入对应的行,最后合并
4.当字符串长度没有行数多市,为一列,或者行数为1的情况,不需要计算
代码
javascript
/**
* @param {string} s
* @param {number} numRows
* @return {string}
*/
var convert = function(s, numRows) {
// 可能存在字符串长度没有行数多的情况,和一行的情况,就直接返回
if(s.length<=numRows || numRows === 1){return s}
// 创建一个数组,个数为行数
const arr = new Array(numRows).fill('')
// 当前字母对应的行
let num = 0
// true 表示向下+ ,false 为向上-
let plus = true
for(let i = 0; i<s.length;i++){
// 每次项当前行里添加字符串
arr[num] += s[i]
if(plus){ // 向下行+1
num += 1
}else{ // 向上行-1
num -= 1
}
if(num === 0){ // 再次到 0 说明到顶了要向下了,为true
plus = true
}
if(num === numRows-1){ // 再次到 底部 说明要向上了,为false
plus = false
}
}
return arr.join('')
};
代码分析:
这段代码是一个JavaScript函数,名为 convert,其目的是将一个字符串 s 进行Z字形变换,生成一个新的字符串。这个变换通常用于将一个长字符串按照Z字形排列到有限的行数 numRows 中。下面是对这段代码的逐行解释:
-
var convert = function(s, numRows) {...}: 定义了一个名为convert的函数,接受两个参数:字符串s和行数numRows。 -
if(s.length<=numRows || numRows === 1){return s}: 如果字符串的长度小于或等于行数,或者行数为1,直接返回原始字符串,因为不需要变换。 -
const arr = new Array(numRows).fill(''): 创建一个长度为numRows的数组,并将每个元素初始化为空字符串。 -
let num = 0: 定义一个变量num来记录当前字符应该放置的行索引。 -
let plus = true: 定义一个布尔变量plus来控制num的增减方向,初始为true表示向下移动。 -
for(let i = 0; i<s.length;i++): 使用一个循环遍历原始字符串s的每个字符。 -
arr[num] += s[i]: 将当前字符添加到数组arr的当前行num的末尾。 -
if(plus){ num += 1 } else { num -= 1 }: 根据plus的值决定num是增加还是减少。 -
if(num === 0){ plus = true }: 当num变为0时,意味着已经到达了数组的最上面一行,接下来应该向下移动,所以将plus设置为true。 -
if(num === numRows-1){ plus = false }: 当num变为numRows-1时,意味着已经到达了数组的最下面一行,接下来应该向上移动,所以将plus设置为false。 -
return arr.join(''): 最后,将数组arr中的所有元素连接起来,形成一个新的字符串,并返回。
这段代码的逻辑是模拟Z字形的路径,从左上角开始,先向下移动,到达底部后向上移动,到达顶部后再次向下,如此循环,直到所有的字符都被放置到数组中。最后,将这个数组的元素按照行的顺序连接起来,形成变换后的字符串。
小知识点:
javascript
const arr = new Array(numRows).fill('')
初始化一个4行的数组,每行都是空字符串,用于存放每一行的数值
javascript
["", "", "", ""]
在JavaScript中,arr.join('') 是一个字符串操作,用于将数组 arr 中的所有元素连接(join)成一个单一的字符串。这里的 '' 表示连接时不使用任何分隔符。
让我们分解这个操作:
arr是要被连接的数组。join('')是数组的一个方法,它返回一个由数组中的所有元素组成的新字符串。- 第一个参数
''(空字符串)告诉join方法在连接数组元素时不添加任何字符作为分隔。 - 如果不提供参数,或者参数是一个字符串,那么这个字符串会被用作数组元素之间的分隔符。
- 第一个参数
例如,如果我们有一个数组 arr = ["Hello", "World", "!"],执行 arr.join('') 将返回字符串 "HelloWorld!"。
在Z字形字符串变换的上下文中,return arr.join('') 用于将经过Z字形变换后存储在数组 arr 中的每一行连接起来,形成一个单一的字符串,然后返回这个字符串。这样,原本二维的Z字形排列就被转换成了一维的字符串形式,符合题目要求的输出格式。