日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

leetcode_zigzag conversion

發(fā)布時(shí)間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode_zigzag conversion 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目:
The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

P A H N
A P L S I I G
Y I R
And then read line by line: “PAHNAPLSIIGYIR”
我的答案:
版本一:

string convert(string s, int numRows) {if (numRows == 1)return s;int L = s.length();const char *p = s.c_str();vector<vector<char> > A;vector<char> a;int N = 0;while (N < L){if (N > L)break;for (int i = 0; i < numRows; i++){if (N < L){a.push_back(*(p + N));N++;}elsebreak;}A.push_back(a);a.clear();for (int i = numRows - 2; i > 0; i--){if (N < L){for (int j = 0; j < numRows; j++){if (N < L){if (j != i)a.push_back('\0');else{a.push_back(*(p + N));N++;}}elsebreak;}A.push_back(a);a.clear();}elsebreak;}}//對(duì)最后一列的數(shù)據(jù)進(jìn)行完善,因?yàn)樽址L(zhǎng)度是隨機(jī)的,所以最后一列可能在沒(méi)有裝滿之前,字符串已經(jīng)被分配完畢,所以采用這種方式補(bǔ)全,以進(jìn)行下面每行的鏈接int last_size = A[A.size() - 1].size();if (last_size != numRows){for (int i = 0; i < numRows - last_size; i++)A[A.size() - 1].push_back('\0');}//數(shù)據(jù)已經(jīng)存好for (int i = 0; i < A.size(); i++){for (int j = 0; j < A[i].size(); j++)cout << A[i][j] << " ";cout << endl;}stringstream ss;for (int i = 0; i < numRows; i++){for (int j = 0; j < A.size(); j++){if (A[j][i] == '\0')continue;elsess << A[j][i];}}return ss.str(); }

思路解析:遍歷整個(gè)字符串,將其按照之字形的結(jié)構(gòu),按列存儲(chǔ),顯然除了部分列的元素個(gè)數(shù)是numRows之外,其他列的元素個(gè)數(shù)都是1,為了后續(xù)字符重新排序的方便,將每列不含有字符串字符的地方用結(jié)束符代替,使得每列數(shù)據(jù)在存儲(chǔ)中占用相同的空間,在后續(xù)數(shù)據(jù)重新排序的時(shí)候,只需要循環(huán)遍歷所有的列并依次輸出各列的元素(遇到結(jié)束符的時(shí)候,不輸出該字符),在利用該方法的時(shí)候關(guān)鍵是保證一開(kāi)始在遍歷存儲(chǔ)字符串的時(shí)候要保證每列都占用相同的空間,并且所有列中的非結(jié)束符字符的存放結(jié)構(gòu)滿足之字形結(jié)構(gòu)。所以如果最后在遍歷字符串結(jié)束后,要判斷最后一列的元素是否為numRows個(gè),如不是需要利用結(jié)束符補(bǔ)全。整個(gè)算法的思想就是不用費(fèi)力去觀察之字形結(jié)構(gòu)的規(guī)律并建模,只需要按列存儲(chǔ)之后并循環(huán)遍歷輸出即可,比較好理解,但是運(yùn)行時(shí)間較長(zhǎng)。
版本二(進(jìn)階版):

string zigzag_convert(string s, int numRows) {if (numRows == 1)return s;if (numRows < 1)return "";int gap = 2 * numRows - 2;int val = 0;int L = s.length();string res = "";for (int i = 0; i < numRows; i++,val += 2){res += s[i];for (int j = i; j<L;){if ((gap - val) != 0){j += (gap - val);if (j < L)res += s[j];elsebreak;}if (val != 0){j += val;if (j < L)res += s[j];elsebreak;}}}return res; }

思路解析:該版本的思想是觀察之字形結(jié)構(gòu)并進(jìn)行建模。舉例說(shuō)明:
假設(shè)輸入字符串為S,
S=”abcdefghijklmnopqrstuvwxyz”;
numRows=5;
以下是之字形中每行元素在字符串中的下標(biāo)(為了方便表述,從數(shù)據(jù)存儲(chǔ)的角度出發(fā),引入第0行):
第0行:0 8 16 24
第1行:1 7 9 15 17 23 25
第2行:2 6 10 14 18 22
第3行:3 5 11 13 19 21
第4行:4 12 20
觀察以上下標(biāo),可以得到結(jié)論,除了第0行與最后一行,每相隔的兩個(gè)下標(biāo)之間的距離都是:gap=2*numRows-2,每行的第一個(gè)元素的下標(biāo)都與行號(hào)相同;第0行與最后一行的各元素相鄰下標(biāo)的距離為gap;根據(jù)這個(gè)規(guī)律寫出以上代碼。顯然,利用這種方法不會(huì)消耗多余的空間,而且只需要遍歷一次字符串即可,算法高效。

總結(jié)

以上是生活随笔為你收集整理的leetcode_zigzag conversion的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。