From 658601137ae4baae921afaa74d6d00aa5d2b7309 Mon Sep 17 00:00:00 2001 From: Sangeeth Sudheer Date: Wed, 13 Apr 2022 00:38:54 +0530 Subject: [PATCH] add complement of base 10 integer soln --- 0476_number-complement/README.md | 25 +++++++++++++++ 0476_number-complement/python3/linear.py | 18 +++++++++++ 0476_number-complement/python3/solution.py | 17 ++++++++++ 1054_complement-of-base-10-integer/README.md | 32 +++++++++++++++++++ .../python3/linear.py | 18 +++++++++++ .../python3/solution.py | 17 ++++++++++ 6 files changed, 127 insertions(+) create mode 100644 0476_number-complement/README.md create mode 100644 0476_number-complement/python3/linear.py create mode 100644 0476_number-complement/python3/solution.py create mode 100644 1054_complement-of-base-10-integer/README.md create mode 100644 1054_complement-of-base-10-integer/python3/linear.py create mode 100644 1054_complement-of-base-10-integer/python3/solution.py diff --git a/0476_number-complement/README.md b/0476_number-complement/README.md new file mode 100644 index 0000000..26b0f12 --- /dev/null +++ b/0476_number-complement/README.md @@ -0,0 +1,25 @@ +The **complement** of an integer is the integer you get when you flip all the `0`'s to `1`'s and all the `1`'s to `0`'s in its binary representation. + +* For example, The integer `5` is `"101"` in binary and its **complement** is `"010"` which is the integer `2`. + +Given an integer `num`, return _its complement_. + +**Example 1:** + + Input: num = 5 + Output: 2 + Explanation: The binary representation of 5 is 101 (no leading zero bits), and its complement is 010. So you need to output 2. + + +**Example 2:** + + Input: num = 1 + Output: 0 + Explanation: The binary representation of 1 is 1 (no leading zero bits), and its complement is 0. So you need to output 0. + + +**Constraints:** + +* `1 <= num < 231` + +**Note:** This question is the same as 1009: [https://leetcode.com/problems/complement-of-base-10-integer/](https://leetcode.com/problems/complement-of-base-10-integer/) \ No newline at end of file diff --git a/0476_number-complement/python3/linear.py b/0476_number-complement/python3/linear.py new file mode 100644 index 0000000..35125e9 --- /dev/null +++ b/0476_number-complement/python3/linear.py @@ -0,0 +1,18 @@ +# Time: O(N) where N is number of bits +class Solution: + def findComplement(self, n: int) -> int: + if n == 0: + return 1 + + cn, bit = n, 1 + + while n > 0: + # XOR 1 can be used to flip bit. + # 0 XOR 1 = 1 + # 1 XOR 1 = 0 + cn = cn ^ bit + + bit = bit << 1 + n = n >> 1 + + return cn diff --git a/0476_number-complement/python3/solution.py b/0476_number-complement/python3/solution.py new file mode 100644 index 0000000..a3d1c5a --- /dev/null +++ b/0476_number-complement/python3/solution.py @@ -0,0 +1,17 @@ +class Solution: + def findComplement(self, n: int) -> int: + if n == 0: + return 1 + + mask = n + + # Create mask of length matching num of bits + # in n (taken from Hacker's Delight, Figure 3-1) + mask |= mask >> 1 # \ + mask |= mask >> 2 # \ + mask |= mask >> 4 # |> Totalling 31 bits + mask |= mask >> 8 # / + mask |= mask >> 16 # / + + # XOR 1 will flip the bit + return n ^ mask diff --git a/1054_complement-of-base-10-integer/README.md b/1054_complement-of-base-10-integer/README.md new file mode 100644 index 0000000..2cba332 --- /dev/null +++ b/1054_complement-of-base-10-integer/README.md @@ -0,0 +1,32 @@ +The **complement** of an integer is the integer you get when you flip all the `0`'s to `1`'s and all the `1`'s to `0`'s in its binary representation. + +* For example, The integer `5` is `"101"` in binary and its **complement** is `"010"` which is the integer `2`. + +Given an integer `n`, return _its complement_. + +**Example 1:** + + Input: n = 5 + Output: 2 + Explanation: 5 is "101" in binary, with complement "010" in binary, which is 2 in base-10. + + +**Example 2:** + + Input: n = 7 + Output: 0 + Explanation: 7 is "111" in binary, with complement "000" in binary, which is 0 in base-10. + + +**Example 3:** + + Input: n = 10 + Output: 5 + Explanation: 10 is "1010" in binary, with complement "0101" in binary, which is 5 in base-10. + + +**Constraints:** + +* `0 <= n < 109` + +**Note:** This question is the same as 476: [https://leetcode.com/problems/number-complement/](https://leetcode.com/problems/number-complement/) \ No newline at end of file diff --git a/1054_complement-of-base-10-integer/python3/linear.py b/1054_complement-of-base-10-integer/python3/linear.py new file mode 100644 index 0000000..e2a33a6 --- /dev/null +++ b/1054_complement-of-base-10-integer/python3/linear.py @@ -0,0 +1,18 @@ +# Time: O(N) where N is number of bits +class Solution: + def bitwiseComplement(self, n: int) -> int: + if n == 0: + return 1 + + cn, bit = n, 1 + + while n > 0: + # XOR 1 can be used to flip bit. + # 0 XOR 1 = 1 + # 1 XOR 1 = 0 + cn = cn ^ bit + + bit = bit << 1 + n = n >> 1 + + return cn diff --git a/1054_complement-of-base-10-integer/python3/solution.py b/1054_complement-of-base-10-integer/python3/solution.py new file mode 100644 index 0000000..c5717aa --- /dev/null +++ b/1054_complement-of-base-10-integer/python3/solution.py @@ -0,0 +1,17 @@ +class Solution: + def bitwiseComplement(self, n: int) -> int: + if n == 0: + return 1 + + mask = n + + # Create mask of length matching num of bits + # in n (taken from Hacker's Delight, Figure 3-1) + mask |= mask >> 1 # \ + mask |= mask >> 2 # \ + mask |= mask >> 4 # |> Totalling 31 bits + mask |= mask >> 8 # / + mask |= mask >> 16 # / + + # XOR 1 will flip the bit + return n ^ mask