diff --git a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/README.md b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/README.md index 51d61dcab7629..fcf7752976223 100644 --- a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/README.md +++ b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/README.md @@ -69,7 +69,11 @@ tags: -### 方法一 +### 方法一:位运算 + +根据题目描述,我们只需要计算 $\textit{start} \oplus \textit{goal}$ 的二进制表示中有多少个 1 即可。 + +时间复杂度 $O(\log n)$,其中 $n$ 是题目中整数的大小。空间复杂度 $O(1)$。 @@ -78,12 +82,7 @@ tags: ```python class Solution: def minBitFlips(self, start: int, goal: int) -> int: - t = start ^ goal - ans = 0 - while t: - ans += t & 1 - t >>= 1 - return ans + return (start ^ goal).bit_count() ``` #### Java @@ -91,13 +90,7 @@ class Solution: ```java class Solution { public int minBitFlips(int start, int goal) { - int t = start ^ goal; - int ans = 0; - while (t != 0) { - ans += t & 1; - t >>= 1; - } - return ans; + return Integer.bitCount(start ^ goal); } } ``` @@ -108,13 +101,7 @@ class Solution { class Solution { public: int minBitFlips(int start, int goal) { - int t = start ^ goal; - int ans = 0; - while (t) { - ans += t & 1; - t >>= 1; - } - return ans; + return __builtin_popcount(start ^ goal); } }; ``` @@ -123,13 +110,7 @@ public: ```go func minBitFlips(start int, goal int) int { - t := start ^ goal - ans := 0 - for t != 0 { - ans += t & 1 - t >>= 1 - } - return ans + return bits.OnesCount(uint(start ^ goal)) } ``` @@ -137,13 +118,16 @@ func minBitFlips(start int, goal int) int { ```ts function minBitFlips(start: number, goal: number): number { - let tmp = start ^ goal; - let ans = 0; - while (tmp !== 0) { - ans += tmp & 1; - tmp >>= 1; - } - return ans; + return bitCount(start ^ goal); +} + +function bitCount(i: number): number { + i = i - ((i >>> 1) & 0x55555555); + i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); + i = (i + (i >>> 4)) & 0x0f0f0f0f; + i = i + (i >>> 8); + i = i + (i >>> 16); + return i & 0x3f; } ``` @@ -152,26 +136,42 @@ function minBitFlips(start: number, goal: number): number { ```rust impl Solution { pub fn min_bit_flips(start: i32, goal: i32) -> i32 { - let mut tmp = start ^ goal; - let mut ans = 0; - while tmp != 0 { - ans += tmp & 1; - tmp >>= 1; - } - ans + (start ^ goal).count_ones() as i32 } } ``` +#### JavaScript + +```js +/** + * @param {number} start + * @param {number} goal + * @return {number} + */ +var minBitFlips = function (start, goal) { + return bitCount(start ^ goal); +}; + +function bitCount(i) { + i = i - ((i >>> 1) & 0x55555555); + i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); + i = (i + (i >>> 4)) & 0x0f0f0f0f; + i = i + (i >>> 8); + i = i + (i >>> 16); + return i & 0x3f; +} +``` + #### C ```c int minBitFlips(int start, int goal) { - int tmp = start ^ goal; + int x = start ^ goal; int ans = 0; - while (tmp) { - ans += tmp & 1; - tmp >>= 1; + while (x) { + ans += (x & 1); + x >>= 1; } return ans; } @@ -181,30 +181,4 @@ int minBitFlips(int start, int goal) { - - -### Solution 2 - - - -#### TypeScript - -```ts -function minBitFlips(start: number, goal: number): number { - return (start ^ goal).toString(2).replace(/0/g, '').length; -} -``` - -#### JavaScript - -```js -function minBitFlips(start, goal) { - return (start ^ goal).toString(2).replace(/0/g, '').length; -} -``` - - - - - diff --git a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/README_EN.md b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/README_EN.md index d2f26e5713d7d..381de5ad70d3c 100644 --- a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/README_EN.md +++ b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/README_EN.md @@ -66,7 +66,11 @@ It can be shown we cannot convert 3 to 4 in less than 3 steps. Hence, we return -### Solution 1 +### Solution 1: Bit Manipulation + +According to the problem description, we only need to count the number of 1s in the binary representation of $\textit{start} \oplus \textit{goal}$. + +The time complexity is $O(\log n)$, where $n$ is the size of the integers in the problem. The space complexity is $O(1)$. @@ -75,12 +79,7 @@ It can be shown we cannot convert 3 to 4 in less than 3 steps. Hence, we return ```python class Solution: def minBitFlips(self, start: int, goal: int) -> int: - t = start ^ goal - ans = 0 - while t: - ans += t & 1 - t >>= 1 - return ans + return (start ^ goal).bit_count() ``` #### Java @@ -88,13 +87,7 @@ class Solution: ```java class Solution { public int minBitFlips(int start, int goal) { - int t = start ^ goal; - int ans = 0; - while (t != 0) { - ans += t & 1; - t >>= 1; - } - return ans; + return Integer.bitCount(start ^ goal); } } ``` @@ -105,13 +98,7 @@ class Solution { class Solution { public: int minBitFlips(int start, int goal) { - int t = start ^ goal; - int ans = 0; - while (t) { - ans += t & 1; - t >>= 1; - } - return ans; + return __builtin_popcount(start ^ goal); } }; ``` @@ -120,13 +107,7 @@ public: ```go func minBitFlips(start int, goal int) int { - t := start ^ goal - ans := 0 - for t != 0 { - ans += t & 1 - t >>= 1 - } - return ans + return bits.OnesCount(uint(start ^ goal)) } ``` @@ -134,13 +115,16 @@ func minBitFlips(start int, goal int) int { ```ts function minBitFlips(start: number, goal: number): number { - let tmp = start ^ goal; - let ans = 0; - while (tmp !== 0) { - ans += tmp & 1; - tmp >>= 1; - } - return ans; + return bitCount(start ^ goal); +} + +function bitCount(i: number): number { + i = i - ((i >>> 1) & 0x55555555); + i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); + i = (i + (i >>> 4)) & 0x0f0f0f0f; + i = i + (i >>> 8); + i = i + (i >>> 16); + return i & 0x3f; } ``` @@ -149,26 +133,42 @@ function minBitFlips(start: number, goal: number): number { ```rust impl Solution { pub fn min_bit_flips(start: i32, goal: i32) -> i32 { - let mut tmp = start ^ goal; - let mut ans = 0; - while tmp != 0 { - ans += tmp & 1; - tmp >>= 1; - } - ans + (start ^ goal).count_ones() as i32 } } ``` +#### JavaScript + +```js +/** + * @param {number} start + * @param {number} goal + * @return {number} + */ +var minBitFlips = function (start, goal) { + return bitCount(start ^ goal); +}; + +function bitCount(i) { + i = i - ((i >>> 1) & 0x55555555); + i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); + i = (i + (i >>> 4)) & 0x0f0f0f0f; + i = i + (i >>> 8); + i = i + (i >>> 16); + return i & 0x3f; +} +``` + #### C ```c int minBitFlips(int start, int goal) { - int tmp = start ^ goal; + int x = start ^ goal; int ans = 0; - while (tmp) { - ans += tmp & 1; - tmp >>= 1; + while (x) { + ans += (x & 1); + x >>= 1; } return ans; } @@ -178,30 +178,4 @@ int minBitFlips(int start, int goal) { - - -### Solution 2 - - - -#### TypeScript - -```ts -function minBitFlips(start: number, goal: number): number { - return (start ^ goal).toString(2).replace(/0/g, '').length; -} -``` - -#### JavaScript - -```js -function minBitFlips(start, goal) { - return (start ^ goal).toString(2).replace(/0/g, '').length; -} -``` - - - - - diff --git a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.c b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.c index 00ab3a363bb2f..5aabc6578c564 100644 --- a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.c +++ b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.c @@ -1,9 +1,9 @@ int minBitFlips(int start, int goal) { - int tmp = start ^ goal; + int x = start ^ goal; int ans = 0; - while (tmp) { - ans += tmp & 1; - tmp >>= 1; + while (x) { + ans += (x & 1); + x >>= 1; } return ans; -} \ No newline at end of file +} diff --git a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.cpp b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.cpp index 92e676e7dbb69..16c874919a2aa 100644 --- a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.cpp +++ b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.cpp @@ -1,12 +1,6 @@ class Solution { public: int minBitFlips(int start, int goal) { - int t = start ^ goal; - int ans = 0; - while (t) { - ans += t & 1; - t >>= 1; - } - return ans; + return __builtin_popcount(start ^ goal); } -}; \ No newline at end of file +}; diff --git a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.go b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.go index fb303355ae48a..65f8639bea1c7 100644 --- a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.go +++ b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.go @@ -1,9 +1,3 @@ func minBitFlips(start int, goal int) int { - t := start ^ goal - ans := 0 - for t != 0 { - ans += t & 1 - t >>= 1 - } - return ans -} \ No newline at end of file + return bits.OnesCount(uint(start ^ goal)) +} diff --git a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.java b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.java index 5b202baf2104c..8cc9970dde506 100644 --- a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.java +++ b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.java @@ -1,11 +1,5 @@ class Solution { public int minBitFlips(int start, int goal) { - int t = start ^ goal; - int ans = 0; - while (t != 0) { - ans += t & 1; - t >>= 1; - } - return ans; + return Integer.bitCount(start ^ goal); } -} \ No newline at end of file +} diff --git a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.js b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.js new file mode 100644 index 0000000000000..32ea3e54ff0f1 --- /dev/null +++ b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.js @@ -0,0 +1,17 @@ +/** + * @param {number} start + * @param {number} goal + * @return {number} + */ +var minBitFlips = function (start, goal) { + return bitCount(start ^ goal); +}; + +function bitCount(i) { + i = i - ((i >>> 1) & 0x55555555); + i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); + i = (i + (i >>> 4)) & 0x0f0f0f0f; + i = i + (i >>> 8); + i = i + (i >>> 16); + return i & 0x3f; +} diff --git a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.py b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.py index 5eb42286a6695..c37c61e95ab97 100644 --- a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.py +++ b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.py @@ -1,8 +1,3 @@ class Solution: def minBitFlips(self, start: int, goal: int) -> int: - t = start ^ goal - ans = 0 - while t: - ans += t & 1 - t >>= 1 - return ans + return (start ^ goal).bit_count() diff --git a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.rs b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.rs index f4f3ca2236ae8..8fd9d9bd0013a 100644 --- a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.rs +++ b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.rs @@ -1,11 +1,5 @@ impl Solution { pub fn min_bit_flips(start: i32, goal: i32) -> i32 { - let mut tmp = start ^ goal; - let mut ans = 0; - while tmp != 0 { - ans += tmp & 1; - tmp >>= 1; - } - ans + (start ^ goal).count_ones() as i32 } } diff --git a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.ts b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.ts index c018069d97d25..cb1e6b8d45d8a 100644 --- a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.ts +++ b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution.ts @@ -1,9 +1,12 @@ function minBitFlips(start: number, goal: number): number { - let tmp = start ^ goal; - let ans = 0; - while (tmp !== 0) { - ans += tmp & 1; - tmp >>= 1; - } - return ans; + return bitCount(start ^ goal); +} + +function bitCount(i: number): number { + i = i - ((i >>> 1) & 0x55555555); + i = (i & 0x33333333) + ((i >>> 2) & 0x33333333); + i = (i + (i >>> 4)) & 0x0f0f0f0f; + i = i + (i >>> 8); + i = i + (i >>> 16); + return i & 0x3f; } diff --git a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution2.js b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution2.js deleted file mode 100644 index 4fcecd4e1714c..0000000000000 --- a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution2.js +++ /dev/null @@ -1,3 +0,0 @@ -function minBitFlips(start, goal) { - return (start ^ goal).toString(2).replace(/0/g, '').length; -} diff --git a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution2.ts b/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution2.ts deleted file mode 100644 index d054ce02959d0..0000000000000 --- a/solution/2200-2299/2220.Minimum Bit Flips to Convert Number/Solution2.ts +++ /dev/null @@ -1,3 +0,0 @@ -function minBitFlips(start: number, goal: number): number { - return (start ^ goal).toString(2).replace(/0/g, '').length; -}