LC6。Z型変換

Z字変換

問題の説明:
  与えられた文字列を、与えられた行数に従って、上から下、左から右へジグザグパターンに配置します。

たとえば、入力文字列が "LEETCODEISHIRING"で、行数が3の場合、配置は次のようになります。

L C I R
ETOE S I I G
E D H N

その後、出力を1行ずつ左から右に読み取って、「LCIRETOESIIGEDHN」などの新しい文字列を生成する必要があります。

文字列を指定した行数に変換する次の関数を実装してください:

string convert(string s、int numRows);

例1:

入力:s = "LEETCODEISHIRING"、numRows = 3
出力: "LCIRETOESIIGEDHN"

例2:

入力:s = "LEETCODEISHIRING"、numRows = 4
出力: "LDREOEIIECIHNTSG"
説明:
L D R
E OE I I
EC I H N
T S G

問題解決のアイデア:

  この質問はルールの検索に関するものであり、多くの解決策はその期間2n-2を見つけることです。私は比較的シンプルで失礼です。各列の文字を対応するコンテナーに直接格納します。最長の列はnumRowsで、中央に1つ必要です基本的にnumRows-2に固定されている、後ろから前に格納することで十分です。

コードは次のとおりです。

#include<iostream>
#include<vector> 
using namespace std;
string convert(string s, int numRows) {
        string a[numRows];
        if(s.size()==numRows){//字符串的大小等于numRows直接返回s
            return s;
        }
        for(int i=0;i<s.size();i++){
            for(int j=0;j<numRows&&i<s.size();j++,i++){//读取完整的一列,i记得要判断会不会出界
                a[j]+=s[i];
            }
            for(int j=numRows-2;j>=1&&i<s.size();j--,i++){//从后往前读取单独一个的一列
                a[j]+=s[i];
            }
            i--;//一次循环结束了会i++,上面结束循环已经+1了,所以要-1
        }
        string tmp="";
        for(int i=0;i<numRows;i++){//把保存的字符串都放到tmp中
            tmp+=a[i];
        }
        return tmp;
    }
int main(){
	string a="LEETCODEISHIRING";
	cout<<convert(a,4);
	return 0;
} 
元の14件の記事を公開 いいね10 訪問者10,000以上

おすすめ

転載: blog.csdn.net/Milan_1in/article/details/105447907