【LeetCode】806. 寫字符串需要的行數(Number of Lines To Write String)的解題思路

題目如下:(題目鏈接戳我

我們要把給定的字符串 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) {
        
    }
}

以下是我的解題思路:

  1. S 轉換爲字符數組 chars
  2. 將字符數組chars強轉爲int數組letters
  3. letters中每個元素都減去97,這樣就變成可以匹配數組下標的int數組了;
  4. 循環letters,用letters中的元素作爲下標,取出widths中的每個數字,並求它們的和sum,當sum大於100時,表明該換行了,將當前數字賦值給sum,並將行數line1
  5. 最後將行數linesum賦值給結果數組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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章