【力扣LeetCode】6 Z 字形變換

題目描述(難度中)

將一個給定字符串根據給定的行數,以從上往下、從左到右進行 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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章