题目描述
将一个给定字符串 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字形排列就被转换成了一维的字符串形式,符合题目要求的输出格式。