LeetCode 1680. Concatenation of Consecutive Binary Numbers Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
1680. Concatenation of Consecutive Binary Numbers

Description

Given an integer n, return the decimal value of the binary string formed by concatenating the binary representations of 1 to n in order, modulo 109 + 7.

 

Example 1:

Input: n = 1
Output: 1
Explanation: "1" in binary corresponds to the decimal value 1. 

Example 2:

Input: n = 3
Output: 27
Explanation: In binary, 1, 2, and 3 corresponds to "1", "10", and "11".
After concatenating them, we have "11011", which corresponds to the decimal value 27.

Example 3:

Input: n = 12
Output: 505379714
Explanation: The concatenation results in "1101110010111011110001001101010111100".
The decimal value of that is 118505380540.
After modulo 109 + 7, the result is 505379714.

 

Constraints:

  • 1 <= n <= 105

Solutions

Solution 1: Bit Manipulation

By observing the pattern of number concatenation, we can find that when concatenating to the i-th number, the result ans formed by concatenating the previous i-1 numbers is actually shifted to the left by a certain number of bits, and then i is added. The number of bits shifted is the number of binary digits in i.

The time complexity is O(n), where n is the given integer. The space complexity is O(1).

PythonJavaC++GoTypeScriptRustJavaScriptC#
class Solution: def concatenatedBinary(self, n: int) -> int: mod = 10**9 + 7 ans = 0 for i in range(1, n + 1): ans = (ans << i.bit_length() | i) % mod return ans(code-box)

Solution 2: Bit Manipulation (Optimization)

In Solution 1, we need to calculate the number of binary digits of i each time, which adds some extra computation. We can use a variable shift to record the current number of bits to shift. When i is a power of 2, shift needs to be incremented by 1.

The time complexity is O(n), where n is the given integer. The space complexity is O(1).

PythonJavaC++GoTypeScriptRustJavaScriptC#
class Solution: def concatenatedBinary(self, n: int) -> int: mod = 10**9 + 7 ans = shift = 0 for i in range(1, n + 1): if (i & (i - 1)) == 0: shift += 1 ans = (ans << shift | i) % mod return ans(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !