Math
Description Given an integer n, return a binary string representing its representation in base -2.
Note that the returned string should not have leading zeros unless the string is "0".
Example 1:
Input: n = 2
Output: "110"
Explantion: (-2)2 + (-2)1 = 2
Example 2:
Input: n = 3
Output: "111"
Explantion: (-2)2 + (-2)1 + (-2)0 = 3
Example 3:
Input: n = 4
Output: "100"
Explantion: (-2)2 = 4
Constraints:
Solutions Solution 1 Thinking
Ordinary conversion to a positive base yields negative remainders for \(-2\) and cannot be used as-is. \(n\le 10^9\) gives \(O(\log n)\) bits, so a digit-by-digit simulation is enough.
The least bit is \(n\bmod 2\) . When it is \(1\) we subtract the current place value \(k\) (a power of \(-1\) on odd positions) so the rest stays even, then divide by \(2\) and flip the sign of \(k\) .
Bits are collected from low to high and reversed. The number \(0\) maps to \(\texttt{0}\) .
Python3 Java C++ Go TypeScript Rust C#
1
2
3
4
5
6
7
8
9
10
11
12
13 class Solution :
def baseNeg2 ( self , n : int ) -> str :
k = 1
ans = []
while n :
if n % 2 :
ans . append ( '1' )
n -= k
else :
ans . append ( '0' )
n //= 2
k *= - 1
return '' . join ( ans [:: - 1 ]) or '0'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 class Solution {
public String baseNeg2 ( int n ) {
if ( n == 0 ) {
return "0" ;
}
int k = 1 ;
StringBuilder ans = new StringBuilder ();
while ( n != 0 ) {
if ( n % 2 != 0 ) {
ans . append ( 1 );
n -= k ;
} else {
ans . append ( 0 );
}
k *= - 1 ;
n /= 2 ;
}
return ans . reverse (). toString ();
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 class Solution {
public :
string baseNeg2 ( int n ) {
if ( n == 0 ) {
return "0" ;
}
int k = 1 ;
string ans ;
while ( n ) {
if ( n % 2 ) {
ans . push_back ( '1' );
n -= k ;
} else {
ans . push_back ( '0' );
}
k *= -1 ;
n /= 2 ;
}
reverse ( ans . begin (), ans . end ());
return ans ;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 func baseNeg2 ( n int ) string {
if n == 0 {
return "0"
}
ans := [] byte {}
k := 1
for n != 0 {
if n % 2 != 0 {
ans = append ( ans , '1' )
n -= k
} else {
ans = append ( ans , '0' )
}
k *= - 1
n /= 2
}
for i , j := 0 , len ( ans ) - 1 ; i < j ; i , j = i + 1 , j - 1 {
ans [ i ], ans [ j ] = ans [ j ], ans [ i ]
}
return string ( ans )
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 function baseNeg2 ( n : number ) : string {
if ( n === 0 ) {
return '0' ;
}
let k = 1 ;
const ans : string [] = [];
while ( n ) {
if ( n % 2 ) {
ans . push ( '1' );
n -= k ;
} else {
ans . push ( '0' );
}
k *= - 1 ;
n /= 2 ;
}
return ans . reverse (). join ( '' );
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 impl Solution {
pub fn base_neg2 ( n : i32 ) -> String {
if n == 0 {
return "0" . to_string ();
}
let mut k = 1 ;
let mut ans = String :: new ();
let mut num = n ;
while num != 0 {
if num % 2 != 0 {
ans . push ( '1' );
num -= k ;
} else {
ans . push ( '0' );
}
k *= - 1 ;
num /= 2 ;
}
ans . chars (). rev (). collect :: < String > ()
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public class Solution {
public string BaseNeg2 ( int n ) {
if ( n == 0 ) {
return "0" ;
}
int k = 1 ;
StringBuilder ans = new StringBuilder ();
int num = n ;
while ( num != 0 ) {
if ( num % 2 != 0 ) {
ans . Append ( '1' );
num -= k ;
} else {
ans . Append ( '0' );
}
k *= - 1 ;
num /= 2 ;
}
char [] cs = ans . ToString (). ToCharArray ();
Array . Reverse ( cs );
return new string ( cs );
}
}
GitHub