Z 字形变换
题目:
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。
请你实现这个将字符串进行指定行数变换的函数:
示例 1:
输入: s = “LEETCODEISHIRING”, numRows = 3
输出: “LCIRETOESIIGEDHN”
示例 2:
输入: s = “LEETCODEISHIRING”, numRows = 4
输出: “LDREOEIIECIHNTSG”
解释:
L D R
E O E I I
E C I H N
T S G
解题:
class Solution {
/**
* @param String $s
* @param Integer $numRows
* @return String
*/
function convert($s, $numRows) {
$res_str = '';
if( strlen($s) == 0 || $numRows < 0 ) {
return $res_str;
}
$j = 1;
$fx = 1; // 递增/减方向
for( $i = 0; $i < strlen($s); $i++ ) {
$ss = substr( $s, $i, 1 );
$res_arr[$j] .= $ss;
if ( $fx == 1 ) {
if ( $j == $numRows ) {
$fx = 2;
$j--;
}else {
$j++;
}
}else{
if ( $j == 1 ) {
$fx = 1;
$j++;
}else {
$j--;
}
}
}
$res_str = implode('', $res_arr);
return $res_str;
}
}
解题思路:
输入一串字符串,按z字形输出N行,然后从左到右每行字符串连接。
将每行字符串看成数组的一个元素,原字符串从左到右依次截取一个字符串,对应的行数是1->N->1->N循环递增递减,默认从第一个字符串开始截取放在第一行$j=1
,递增/减方向$fx = 1; 1为递增,2为递减
,当递增到最大行时转为递减$fx = 2
,行数减$j--;
,反之转为递增$fx = 1
,行数加$j++;
if ( $fx == 1 ) {
if ( $j == $numRows ) {
$fx = 2;
$j--;
}else {
$j++;
}
}else{
if ( $j == 1 ) {
$fx = 1;
$j++;
}else {
$j--;
}
}
题目来源:
https://leetcode-cn.com/problems/zigzag-conversion/