Z 字形变换

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值