馬さんとアルゴリズムを勉強します.06
4489 ワード
馬さんに従ってLeetCodeの計算方法を使って、自分もついでに考えを整理します.こちらは馬さんのコラムです.馬志峰さんのプログラミングノートです.
テーマは06 ZigZig Coversionです.
与えられた文字列をN行に並べて出力します.個人は比較的に馬鹿で、直接テーマによって言います.ここで1~16の例をあげます.
1
7
13
2
6
8
12
14
3
5
9
11
15
4
10
16
Zタイプで出力すると1 7 13 2 6 8 12 14 5 9 11 15 4 10 16になります.内在する規則を考慮せずに、直接第一列から見ると、数字は列の増加とともに増加し、最後の行すなわち第四行になると、5は斜め上になり、数字は列の減少とともに増大する.ポイントはどのように定義して増加し、いつ定義が減少しますか?
最初の行に数字があると増加し始め、4行目になると減少します.C++の中では0行目から始まるので、反対に3行目から減少します.
すべてのコードは以下の通りです.
0
4
8
1
3
5
7
9
2
6
10
0
6
12
1
5
7
11
13
2
4
8
10
14
3
9
15
各満列間の数字の間隔は2*(numRow-1)です.中間行間の間隔は2*(numRow-1)-2*iである.
具体的な計算方は參考します.http://blog.csdn.net/gg543012991/article/details/53192501;
自分もプログラミングというものに触れたばかりで、シロとしては自分の考えを書いているだけです.
テーマは06 ZigZig Coversionです.
与えられた文字列をN行に並べて出力します.個人は比較的に馬鹿で、直接テーマによって言います.ここで1~16の例をあげます.
1
7
13
2
6
8
12
14
3
5
9
11
15
4
10
16
Zタイプで出力すると1 7 13 2 6 8 12 14 5 9 11 15 4 10 16になります.内在する規則を考慮せずに、直接第一列から見ると、数字は列の増加とともに増加し、最後の行すなわち第四行になると、5は斜め上になり、数字は列の減少とともに増大する.ポイントはどのように定義して増加し、いつ定義が減少しますか?
最初の行に数字があると増加し始め、4行目になると減少します.C++の中では0行目から始まるので、反対に3行目から減少します.
class Solution {
public:
string convert(string s, int numRows) {
}
};
leetcodeの定義はこのようです.ですから、先ほどの思想に基づいて書いたキーコードです. vector<string> vecstring(numRows); // numRows String
int row = 0;
bool change = true;
for(auto c : s)
{
auto &cstring = vecstring[row];
cstring = cstring + c; // string 。
if(row == 0)
{
change = true;
}
if(numRows - 1 == row)
{
change = false;
}
change ? (++row) : (--row); // ++row , --row // , row 0 ++row
}
コードもポニーを参考にしていますが、これまでは分かりませんでした. if(numRows - 1 == row)
{
change = false;
}
change ? (++row) : (--row);
後になって、自分の理解が間違っていたことに気づきました.検索するたびにif(numRows-1=row)を判断します.実は偽と判断した時はずっと(–row)の操作をしています.すべてのコードは以下の通りです.
class Solution {
public:
string convert(string s, int numRows) {
if(numRows == 1)
{
return s;
}
vector<string> vecstring(numRows);
int row = 0;
bool change = true;
for(auto c : s)
{
auto &cstring = vecstring[row];
cstring = cstring + c;
if(row == 0)
{
change = true;
}
if(numRows - 1 == row)
{
change = false;
}
change ? (++row) : (--row);
}
string sResult;
for(auto b : vecstring) // string, sResult 。
{
sResult += b;
}
return sResult;
}
};
この問題にはもう一つの考えの解法があります.0
4
8
1
3
5
7
9
2
6
10
0
6
12
1
5
7
11
13
2
4
8
10
14
3
9
15
各満列間の数字の間隔は2*(numRow-1)です.中間行間の間隔は2*(numRow-1)-2*iである.
具体的な計算方は參考します.http://blog.csdn.net/gg543012991/article/details/53192501;
自分もプログラミングというものに触れたばかりで、シロとしては自分の考えを書いているだけです.