N 字形变换

<?php
/**
 * N 字形变换
 *
 * User: hihone
 * Date: 2019/2/1
 * Time: 14:26
 * Description:
 * 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 N 字形排列。
 * 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
 *  L   C   I   R
 * E T O E S I I G
 * E   D   H   N
 */

/**
 * @param $s
 * @param $numRows
 *
 * @return string
 */
function convert($s, $numRows)
{
    if ($numRows == 1) return $s;
    $len  = min(strlen($s), $numRows);
    $data = [];

    #构造行数
    for ($i = 0; $i < $len; $i++) array_push($data, []);

    $curRow = 0;
    $down   = false;
    foreach (str_split($s) as $key => $val) {
        array_push($data[$curRow], $val);
        if ($curRow == 0 || $curRow == $numRows - 1) $down = !$down;
        $down ? ++$curRow : --$curRow;
    }
    $result = [];
    array_map(function ($value) use (&$result) {
        $result = array_merge($result, array_values($value));
    }, $data);
    return implode('', $result);

}

$s = 'PAYPALISHIRING';
$r = convert($s, 3);
echo $r;#PAHNAPLSIIGYIR

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值