題目描述(難度中)
將一個給定字符串根據給定的行數,以從上往下、從左到右進行 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;
}
};