vs2015做的網(wǎng)站廈門人才網(wǎng)招聘官網(wǎng)
目錄
- 題目描述:
- 輸入:
- 輸出:
- 代碼實現(xiàn):
題目描述:
將一個給定字符串 s 根據(jù)給定的行數(shù) numRows ,以從上往下、從左到右進行 Z 字形排列。
比如輸入字符串為 “PAYPALISHIRING” 行數(shù)為 3 時,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的輸出需要從左往右逐行讀取,產(chǎn)生出一個新的字符串,比如:“PAHNAPLSIIGYIR”。
請你實現(xiàn)這個將字符串進行指定行數(shù)變換的函數(shù):
string convert(string s, int numRows);
代碼調(diào)試效果圖:
輸入:
s = "PAYPALISHIRING", numRows = 3
輸出:
"PAHNAPLSIIGYIR"
代碼實現(xiàn):
public class Main {public static void main(String[] args) {// TODO Auto-generated method stubString s = "PAYPALISHIRING";System.out.println(convert(s, 3));//PAHNAPLSIIGYIR}public static String convert(String s, int numRows) {// 使用二維數(shù)組模擬,行數(shù)已知,需要確定列數(shù)int len = s.length();// 總共的字符長度if (len <= numRows || numRows <= 1) {//無法構(gòu)成z型的情況return s;}int numCols = 0;// 列數(shù)int numCyc = numRows * 2 - 2;// 一個周期包含的字符數(shù)int cyc = len / numCyc;// 循環(huán)周期數(shù)int more = len % numCyc;// 最后一個周期的字符數(shù)if (more > numRows) {// 最后一個周期的字符數(shù)超過了一列的情況numCols = cyc * (numRows - 1) + more - (numRows - 1);// 周期長度+不足一個周期的列的長度} else {// 沒有超過一列的長度numCols = cyc * (numRows - 1) + 1;// 沒超過一列算成一列}char[][] arr = new char[numRows][numCols];// 創(chuàng)建二維數(shù)組:存儲字符元素int index = 0;//已經(jīng)遍歷過的字符個數(shù)int i = 0, j = 0;//i表示行,j表示列while (j < numCols) {//列if (index == len) {//循環(huán)出口:當(dāng)遍歷個數(shù)=字符個數(shù)break;}while (i < numRows) {//行if (index < len) {char c = s.charAt(index);//獲取字符串中的每一個字符if (numRows == numCyc) {//循環(huán)周期的元素個數(shù)等于行數(shù)時:直接從上到下,從左到右寫入arr[i++][j] = c;if (i == numRows) {i = 0;//回到第一行j++;//列數(shù)進一}index++;//字符計數(shù)} else {//循環(huán)周期的元素個數(shù)不等于行數(shù):形成z型時if (index % numCyc < numRows) {//字符在同一行的情況arr[i++][j] = c;if (i == numRows) {//當(dāng)遍歷到最下方時,回溯到上一行i--;}} else {//字符不在同一行的情況arr[--i][++j] = c;//對當(dāng)前位置的右上方:插入字符if (i - 1 == 0) {//下一個循環(huán)周期的入口i--;j++;//向右上方移動到第一行}}index++;//字符計數(shù)}} else {//內(nèi)層循環(huán)出口:計數(shù)元素個數(shù)達(dá)到字符串大小時break;}}}//拼接數(shù)組中不為空的字符串StringBuilder res = new StringBuilder();//從左到右,從上到下進行遍歷for (int k = 0; k < arr.length; k++) {for (int l = 0; l < arr[k].length; l++) {if (arr[k][l] != '\0') {//ASCII碼不為0的字符,才進行拼接res.append(arr[k][l]);}}}return res.toString();//轉(zhuǎn)化為字符串}
}