題目如下:(題目鏈接戳我)
我們要把給定的字符串 S 從左到右寫到每一行上,每一行的最大寬度為100個單位,如果我們在寫某個字母的時候會使這行超過了100 個單位,那么我們應該把這個字母寫到下一行。我們給定了一個數組 widths ,這個數組 widths[0] 代表 'a' 需要的單位, widths[1] 代表 'b' 需要的單位,..., widths[25] 代表 'z' 需要的單位。
現在回答兩個問題:至少多少行能放下S,以及最后一行使用的寬度是多少個單位?將你的答案作為長度為2的整數列表返回。
示例 1:
輸入:
widths = [10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
S = "abcdefghijklmnopqrstuvwxyz"
輸出: [3, 60]
解釋:
所有的字符擁有相同的占用單位10。所以書寫所有的26個字母,
我們需要2個整行和占用60個單位的一行。
示例 2:
輸入:
widths = [4,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10]
S = "bbbcccdddaaa"
輸出: [2, 4]
解釋:
除去字母'a'所有的字符都是相同的單位10,并且字符串 "bbbcccdddaa" 將會覆蓋 9 * 10 + 2 * 4 = 98 個單位.
最后一個字母 'a' 將會被寫到第二行,因為第一行只剩下2個單位了。
所以,這個答案是2行,第二行有4個單位寬度。
class Solution {
public int[] numberOfLines(int[] widths, String S) {
}
}
以下是我的解題思路:
- 將
S
轉換為字符數組chars
; - 將字符數組
chars
強轉為int
數組letters
; - 將
letters
中每個元素都減去97
,這樣就變成可以匹配數組下標的int
數組了; - 循環
letters
,用letters
中的元素作為下標,取出widths
中的每個數字,并求它們的和sum
,當sum
大于100
時,表明該換行了,將當前數字賦值給sum
,并將行數line
加1
; - 最后將行數
line
和sum
賦值給結果數組result
,并返回;
代碼如下:
class Solution {
public int[] numberOfLines(int[] widths, String S) {
//將 S 轉換為字符數組
char[] chars = S.toCharArray();
//將字符數組轉換為 int 數組
int[] letters = new int[chars.length];
for (int i = 0; i < chars.length; i++) {
//將 int 數組調整為與數組下標對應的 int 數組
letters[i] = chars[i] - 97;
}
int sum = 0;
int line = 1;
for (int letter : letters) {
//用 letters 數組元素作為下標,依次取出每個字母占用的單位數;
//數量累加到一個和 sum 中
sum += widths[letter];
//當 sum 大于 100 時,sum 賦值為當前的單位數,并且行數加 1,繼續下輪循環;
if (sum > 100) {
sum = widths[letter];
line++;
}
}
int[] result = new int[2];
result[0] = line;
result[1] = sum;
return result;
}
}