将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
示例 :
输入: s = “LEETCODEISHIRING”, numRows = 4 输出: “LDREOEIIECIHNTSG”
解释:
L D R
E O E I I
E C I H N
T S G
输入字符串 s 为 “LEETCODEISHIRING”, numRows 为 4 ,如下图:
据观察能得出每2n-2为一个周期,用数组将所获取的值进行拼接。当该值索引除以周期的余数小于给定行数则为数组内元素的索引值(设定索引为i,i%(2n-2)<numRow),如果大于就需要反向 也就是 周期减去余数( (2n-2)-(i%(2n-2)) )
go代码:
func convert(s string, numRows int) string {
if len(s) <= numRows || numRows == 1 {
return s
}
//处理中文字符
var b = []rune(s)
//构建数组
var strArr = make([]string, numRows)
rule := numRows*2-2
for i := 0; i<len(s); i++ {
pos := i%rule
if pos < numRows{
strArr[pos] += string(b[i])
}else{
strArr[rule-pos] += string(b[i])
}
}
return strings.Join(strArr,"")
}
php代码:
/**
* @param String $s
* @param Integer $numRows
* @return String
*/
function convert($s, $numRows) {
if(strlen($s) <= $numRows || $numRows == 1){
return $s;
}
$arr = [];
$add = $numRows*2-2;
for($i=0;$i<strlen($s);$i++){
$pos = $i%$add;
if($i%$add < $numRows){
$arr[$pos] .= $s[$i];
}else{
$arr[$add-$pos] .= $s[$i];
}
}
return implode($arr);
}