目錄標題
- 🌹題目
- 🌹一點點思路
- 🌹我的解題思路
- 🌹開干
- 🌹開始之前我們先介紹今天的函式`StringBuilder的用法總結`
- 🌹正式開始
- 🎃特別介紹:
🌹題目
將一個給定字串 s 根據給定的行數 numRows ,以從上往下、從左到右進行 Z 字形排列,
比如輸入字串為 "PAYPALISHIRING" 行數為 3 時,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的輸出需要從左往右逐行讀取,產生出一個新的字串,比如:"PAHNAPLSIIGYIR",
請你實作這個將字串進行指定行數變換的函式:
string convert(string s, int numRows);
示例 1:
輸入:s = "PAYPALISHIRING", numRows = 3
輸出:"PAHNAPLSIIGYIR"
示例 2:
輸入:s = "PAYPALISHIRING", numRows = 4
輸出:"PINALSIGYAHRPI"
解釋:
P I N
A L S I G
Y A H R
P I
示例 3:
輸入:s = "A", numRows = 1
輸出:"A"
提示:
1 <= s.length <= 1000
s 由英文字母(小寫和大寫)、',' 和 '.' 組成
1 <= numRows <= 1000
通過次數282,291提交次數558,797
🌹一點點思路
說是話我最怕這種圖形題了,我覺的它們一般最好的做法就是別去跟著規律實作這個圖形某一個數值,而應該去找它的規律得到數值,例如楊輝三角的那些題,你不必非要把要得到的數字從頭到尾一個一個算出來,只要找到規律就可以得出結果了,這種題往往是像找規律一樣不是單純的考資料結構和演算法更加考察靈活性,
🌹我的解題思路
我覺得 ==“怕啥來啥”==說的一點也沒錯,我今天就挑戰這個題,看了半天我不擅長找規律就用最直接的辦法,二維陣列開始想的是把一個字串按Z字形放進去有字母的地方把字母存進陣列,后來想想沒必要還不如直接就存進去,

類似這樣,一個二維陣列

好了這下知道怎么存取的方式了,讓我們來看看怎么按Z字形放進去吧,
🌹開干
🌹開始之前我們先介紹今天的函式StringBuilder的用法總結
在程式開發程序中,我們常常碰到字串連接的情況,方便和直接的方式是通過"+"符號來實作,但是這種方式達到目的的效率比較低,且每執行一次都會創建一個String物件,即耗時,又浪費空間,使用StringBuilder類就可以避免這種問題的發生,下面就Stringbuilder的使用做個簡要的總結:
一、創建Stringbuilder物件
StringBuilder strB = new StringBuilder();
1、append(String str)/append(Char c):字串連接
System.out.println("StringBuilder:"+strB.append("ch").append("111").append('c'));
//return "StringBuilder:ch111c"
2、toString():回傳一個與構建起或緩沖器內容相同的字符串
System.out.println("String:"+strB.toString());
//return "String:ch111c"
3、appendcodePoint(int cp):追加一個代碼點,并將其轉換為一個或兩個代碼單元并回傳this
System.out.println("StringBuilder.appendCodePoint:"+strB.appendCodePoint(2));
//return "StringBuilder.appendCodePoint:ch111c"
4、setCharAt(int i, char c):將第 i 個代碼單元設定為 c(可以理解為替換)
strB.setCharAt(2, 'd');
System.out.println("StringBuilder.setCharAt:" + strB);
//return "StringBuilder.setCharAt:chd11c"
5、insert(int offset, String str)/insert(int offset, Char c):在指定位置之前插入字符(串)
System.out.println("StringBuilder.insertString:"+ strB.insert(2, "LS"));
//return "StringBuilder.insertString:chLSd11c"
System.out.println("StringBuilder.insertChar:"+ strB.insert(2, 'L'));
//return "StringBuilder.insertChar:chLLSd11c"
6、delete(int startIndex,int endIndex):洗掉起始位置(含)到結尾位置(不含)之間的字串
System.out.println("StringBuilder.delete:"+ strB.delete(2, 4));
//return "StringBuilder.delete:chSd11c"
🌹正式開始
class Solution {
public String convert(String s, int numRows) {
//當行數小于2的時候就一行(就一個字符)直接回傳這個字符s就可以了
if(numRows < 2) return s;
//下面這兩行就是我上面思路所介紹的二維陣列
List<StringBuilder> ans = new ArrayList<StringBuilder>();
for(int i = 0; i < numRows; i++) ans.add(new StringBuilder());
//i和flag的搭配讓字串以Z字形輸入二維陣列詳情請看下面的詳解
int i = 0, flag = -1;
for(char c : s.toCharArray()) {
ans.get(i).append(c);
if(i == 0 || i == numRows -1) flag = - flag;
i += flag;
}
//將最后結果歸回一個字串并輸出結果
StringBuilder res = new StringBuilder();
for(StringBuilder row : ans) res.append(row);
return res.toString();
}
}
下面這段代碼妙不可言我是借鑒他人的,下面我們就來看看
int i = 0, flag = -1;
//將字串轉為字符陣列等待一個一個輸出
for(char c : s.toCharArray()) {
ans.get(i).append(c);
if(i == 0 || i == numRows -1) flag = - flag;
i += flag;
}
這個演算法里面i控制這二維陣列的行也就是

這兩行主要是
if(i == 0 || i == numRows -1) flag = - flag;
i += flag;

我們還以這個為例

好了到這里也講完了,我們明天再見,
🎃特別介紹:
📣小白練手專欄,適合剛入手的新人歡迎訂閱編程小白進階
📣有什么不明白的歡迎私信或留言,得到細致講解,另外想要進階的朋友可以關注練手專案專欄
📣另外想學JavaWeb進廠的同學可以看看這個專欄:傳送們
📣是個面試和考研的演算法練習我們一起加油上岸之路

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/293359.html
標籤:其他
下一篇:資料結構C語言實作動態順序表
