↓快轉到主要內容
  1. LeetCode/

LeetCode 482: License Key Formatting

·1 分鐘· ·
LeetCode Easy String
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-08-24

  • 提交紀錄:Wrong Answer ×8 → Output Limit Exceeded → Accepted

解題思路
#

只有第一組可以比較短,所以要從尾巴開始每 k 個切一段。先把 - 全部拿掉、轉大寫,再算第一組的長度 len % k(是 0 的話就是 k),之後每 k 個一組,用 "-".join 接起來(String 模板一)。

我的嘗試
#

這題提交了 10 次,都在處理「從後往前每 k 個加一個 -」的計數:

  • 前四版沒有轉大寫:"a" 回傳 "a",答案 "A"。
  • 加上 upper() 之後,計數器從 1 開始又用 c <= k,每組變成 k + 1 個:"B2a"、k = 1 答案 "B-2-A",回傳 "B2-A"。
  • 改成 c < k 之後,k = 1 時第一個字元就進了 else,多出一個 -:"2" 回傳 "2-"。
  • 計數器改從 0 開始就對了,但留下的 print 造成 Output Limit Exceeded,拿掉才 AC。

正確解法
#

class Solution:
    def licenseKeyFormatting(self, s: str, k: int) -> str:
        t = s.replace("-", "").upper()
        first = len(t) % k or k
        groups = [t[:first]] + [t[i:i + k] for i in range(first, len(t), k)]
        return "-".join(g for g in groups if g)

複雜度
#

時間 O(n),空間 O(n)。

要特別避免的錯誤
#

  • 要轉大寫。
  • 每組 k 個;從後往前數時計數器的起始值和比較符號要一致,不然會差一個或在最前面多一個 -。
  • s 全部都是 - 時答案是空字串。

面試口說整理
#

我先把破折號拿掉並轉大寫,第一組的長度是總長度除以 k 的餘數,餘數是 0 就是 k,之後每 k 個一組,用破折號接起來。時間 O(n)。

相關文章

LeetCode 1446: Consecutive Characters
·1 分鐘
LeetCode Easy String
LeetCode 1446 解題筆記:掃一次記錄目前連續相同字元的長度,遇到不同就重設成 1
LeetCode 1869: Longer Contiguous Segments of Ones than Zeros
·1 分鐘
LeetCode Easy String
LeetCode 1869 解題筆記:分別找出最長的連續 1 和最長的連續 0,比較大小;用 split 一行就能做
LeetCode 415: Add Strings
·1 分鐘
LeetCode Easy Math String Simulation
LeetCode 415 解題筆記:兩個指標從尾巴往前逐位相加,記錄進位,迴圈結束後還有進位要補上
LeetCode 459: Repeated Substring Pattern
·1 分鐘
LeetCode Easy String String-Matching Z-Algorithm Knuth-Morris-Pratt-Algorithm
LeetCode 459 解題筆記:s 由某個子字串重複組成,等價於 s 出現在 (s + s) 去掉頭尾字元之後的字串裡
LeetCode 290: Word Pattern
·1 分鐘
LeetCode Easy Hash-Table String
LeetCode 290 解題筆記:pattern 的字元和單字要一對一對應,用兩個方向的 dict 或比較 set 大小
LeetCode 344: Reverse String
·1 分鐘
LeetCode Easy Two-Pointers String
LeetCode 344 解題筆記:左右指針交換後往中間走,原地反轉