leetcode 6 Z 字形变换 c代码
題目如下:
將一個(gè)給定字符串根據(jù)給定的行數(shù),以從上往下、從左到右進(jìn)行 Z 字形排列。比如輸入字符串為 "LEETCODEISHIRING" 行數(shù)為 3 時(shí),排列如下: L C I R E T O E S I I G E D H N 之后,你的輸出需要從左往右逐行讀取,產(chǎn)生出一個(gè)新的字符串,比如:"LCIRETOESIIGEDHN"剛看到這道題的時(shí)候,動手在紙上畫了下,發(fā)現(xiàn)第一行字符出現(xiàn)的下標(biāo)在原始字符串中是有規(guī)律的,ai = i(2 * row - 2),緊接著找下面的行,找了幾分鐘無果。本著先解決問題的態(tài)度,打算暴力解下,使用二維數(shù)組,遍歷字符串,逐個(gè)字符讀取到數(shù)組中,最后再從數(shù)組中讀取出來。這個(gè)想法闊以,點(diǎn)提交的時(shí)候提示超出時(shí)間限制.......暴力無果,卒。
重新找規(guī)律,其實(shí)規(guī)律也不是那么難找,第一行和最后一行規(guī)律基本上都是i(2*row - 2),中間行的字符規(guī)律看似不好找,不是。
每個(gè)字符與下一個(gè)字符是對稱的。例如題目中的第二行,前兩個(gè)字符ET和第一行終點(diǎn)E對稱,距離為n - i,n為總行數(shù),i為第i行。
此外就是第一個(gè)數(shù)和第二數(shù)是對稱的,第二個(gè)數(shù)和第三個(gè)數(shù)也是對稱的,只不過對稱的距離不同,稍稍總結(jié)下可得每行字符下標(biāo)規(guī)律:
設(shè)行數(shù)為i,那么第i行第k個(gè)元素下標(biāo)右下列式子可得: 當(dāng)i為首行或者尾行時(shí),Ak = (i - 1) + 2(row - 2); 當(dāng)i為中間行時(shí),A1 = i - 1;Ak = Ak-1 + (k%2 ? (row - i) : (i - 1));知道了規(guī)律,就可以按行從原始字符串中讀取字符了。
看了官方給的按行讀取方法,順序讀取字符串,添加到行中,每讀取一個(gè)字符,添加到一行中,同時(shí)指向下一行,當(dāng)?shù)搅诵形不蛘咝惺讋t改變行的方向。方法是不錯(cuò),不過如果用c語言實(shí)現(xiàn)的話,不是還得為每一行申請一塊內(nèi)存嗎?這塊內(nèi)存大小又不能確定,這和數(shù)組法有啥區(qū)別。
下面是找規(guī)律的c代碼:
char * convert(char * s, int numRows){int len = 0, row = 0, i = 0, j = 0, k = 0;char *pstr;pstr = s;if (!s || numRows < 2)return s;while (*pstr++ != '\0')len++;if (len < 2)return s;pstr = (char *)malloc(sizeof(char) * (len + 1));if (!pstr)return NULL;i = 0;for (row = 1; row <= numRows; row++){//按行讀取每個(gè)字符下標(biāo)j = row - 1;if (row == 1 || row == numRows){ while (j < len){pstr[i++] = s[j];j += (2 * numRows - 2);}}else{k = 1;while(j < len){pstr[i++] = s[j];j = j + ((k++ % 2) ? 2 * (numRows - row) : 2 * (row - 1));}} }pstr[i] = '\0';return pstr; }編碼的時(shí)候挖了一個(gè)坑," ?: "三目運(yùn)算符的優(yōu)先級低于加號,導(dǎo)致運(yùn)算有問題!!!
參考資料:
1.?數(shù)據(jù)結(jié)構(gòu)?: C語言版/ 嚴(yán)蔚敏,吳偉民編著
=============================================================================================
Linux應(yīng)用程序、內(nèi)核、驅(qū)動開發(fā)交流討論群(745510310),感興趣的同學(xué)可以加群討論、交流、資料查找等,前進(jìn)的道路上,你不是一個(gè)人奧^_^。
總結(jié)
以上是生活随笔為你收集整理的leetcode 6 Z 字形变换 c代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 递归与递推 普通排队问题及带约束条件的排
- 下一篇: leetcode 752. 打开转盘锁