将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。(PHP、GO)

将一个给定字符串 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);
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值