【力扣LeetCode】6 Z 字形变换

版权声明:本文为原创博客,未经允许,请勿转载。 https://blog.csdn.net/u013095333/article/details/90701140

题目描述(难度中)

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

比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
在这里插入图片描述

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

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

输入: s = “LEETCODEISHIRING”, numRows = 3
输出: “LCIRETOESIIGEDHN”

示例 2:

输入: s = “LEETCODEISHIRING”, numRows = 4
输出: “LDREOEIIECIHNTSG”
解释:
在这里插入图片描述

链接

https://leetcode-cn.com/problems/zigzag-conversion/

思路

1、暴力模拟
2、找规律

本人觉得这道题虽然用暴力模拟比较耗时,代码复杂度相对高一些,但是考察点确实是考察编码能力,而不在于找规律
找规律用以下图片上规律即可:
在这里插入图片描述
根据下标规律,直接按行访问组装字符串即可。

代码

class Solution {
public:
    string convert(string s, int numRows) {
    	if(numRows == 1){
    		return s;
    	}
    	char vs[numRows][100];
    	for(int i = 0; i < numRows; i++){
    		for(int j = 0; j < 100; j++){
    			vs[i][j] = '0';
    		}
    	}
    	bool flag = true;   // 表示竖着走还是斜着走 
    	int i = 0;
    	int j = 0;
    	int slen = 0;
    	while(slen < s.length()){// 暴力模拟即可 
    	
    		if(flag){
    			for(int k = 0; k < numRows-1; k++){
	    			vs[i++][j] = s[slen++];
	    			if(slen >= s.length()){
	    				break;
	    			}
	    		}
	    		flag = false;
    		}
    		else{
    			for(int k = 0; k < numRows-1; k++){
    				vs[i--][j++] = s[slen++];
    				if(slen >= s.length()){
    					break;
    				}
    			}
    			flag = true;
    		}
    	}
    	string ans = "";
		for(int i = 0; i < numRows; i++){
			for(int j = 0; j < 100; j++){
				if(vs[i][j] != '0'){
					ans += vs[i][j];
				}
			}
		}
		return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/u013095333/article/details/90701140