LeetCode #6 Z字形变换(思维)

LeetCode #6 Z字形变换

题目描述

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:

L   C   I   R
E T O E S I I G
E   D   H   N

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。

传送门:LeetCode #6 Z字形变换

解法1:暴力二维数组模拟

过程过于繁琐且蠢,不再列举了。

解法2:思维二维数组模拟

是LeetCode官方解法,学习一波,思维真的巧妙。
实际上还是模拟,不过不是真正的模拟了,而是稍微变换了一下,

L   C   I   R
E T O E S I I G
E   D   H   N

变成了

L C I R
E T O E S I I G
E D H N

因为略去了对空白部分的处理,且,在“拐角”处,处理精妙,导致代码非常精简明了。
对于最终的“从上往下,从左往右”产生新的字符串,实际上还是一样的效果。
这里用Vector实现。

class Solution {
public:
    string convert(string s, int numRows) {
    	//如果行数为1,或者字符串长度小于行数,显然直接返回s
        if(numRows==1||s.size()<numRows)
            return s;
        
		//定义numRows个string类型的vector
        vector<string> rows(numRows);
        bool flag=false;//true向上存储,false向下存储
        int nowR=0;
        for(char c:s){
            rows[nowR] = rows[nowR] + c;
            if(nowR==0||nowR==numRows-1){
            	//当且仅当nowR指针到达第一行或最后一行时,flag变向
                flag=!flag;
            }
            nowR = nowR + (flag?1:-1);
        }

        string ans;
        //从vector中取出字符串,拼接到一起
        for(string row:rows){
            ans+=row;
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值