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

LeetCode 3750: Minimum Number of Flips to Reverse Binary String

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

基本資料
#

難易度: easy 第一次嘗試:2025-11-22

  • 提交紀錄:Accepted(一次通過)

解題思路
#

把 n 轉成不含前導零的二進位字串 s,要變成 s 的反轉,每次翻一位。

位置 i 要變成 s[len - 1 - i],兩者不同就要翻一次,所以答案就是 s 和它的反轉有幾個位置不同。

用對撞指針看的話:位置 i 和 len - 1 - i 這一對,如果兩個字元不同,兩邊都要翻,所以每一對不同就貢獻 2。

我的解法
#

class Solution:
    def minimumFlips(self, n: int) -> int:
        s = bin(n)[2:]
        return sum(a != b for a, b in zip(s, reversed(s)))

原本的版本先建一個反轉後的字串,再用迴圈逐位比較,邏輯一樣。

複雜度
#

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

要特別避免的錯誤
#

  • 用 bin(n) 沒有去掉開頭的 0b。
  • 誤以為要反轉成「另一個數字」再比較數值:比的是每一個位元。

面試口說整理
#

我把 n 轉成二進位字串,跟它的反轉逐位比較,不同的位數就是要翻的次數,因為每一位只要翻一次就會變成目標。時間跟位元數成正比,也就是 O(log n)。

相關文章

LeetCode 1768: Merge Strings Alternately
·1 分鐘
LeetCode Easy Two-Pointers String
LeetCode 1768 解題筆記:兩個指針輪流取字元,短的用完後接上長的剩下部分
LeetCode 2000: Reverse Prefix of Word
·1 分鐘
LeetCode Easy Two-Pointers String Stack
LeetCode 2000 解題筆記:找到 ch 第一次出現的位置 i,把 word[:i + 1] 反轉接上後面;找不到就原樣回傳
LeetCode 942: DI String Match
·1 分鐘
LeetCode Easy Array Two-Pointers String Greedy
LeetCode 942 解題筆記:兩個指標分別指向還沒用的最小值和最大值,遇到 I 放最小、遇到 D 放最大
LeetCode 557: Reverse Words in a String III
·1 分鐘
LeetCode Easy Two-Pointers String
LeetCode 557 解題筆記:用空白切開,每個單字各自反轉,再用空白接回去
LeetCode 345: Reverse Vowels of a String
·1 分鐘
LeetCode Easy Two-Pointers String
LeetCode 345 解題筆記:跟 LC 917 一樣的左右指針,只是條件換成「是不是母音」(大小寫都要算)
LeetCode 917: Reverse Only Letters
·1 分鐘
LeetCode Easy Two-Pointers String
LeetCode 917 解題筆記:左右指針各自跳過非字母,兩邊都是字母時交換;字串要先轉成 list 才能改