LeetCode 1017.Convert to Base -2

题目描述

传送门

Given a number N, return a string consisting of "0"s and "1"s that represents its value in base -2 (negative two).
The returned string must have no leading zeroes, unless the string is “0”.

Examples:

Input: 2
Output: “110”
Explantion: (-2) ^ 2 + (-2) ^ 1 = 2

Input: 3
Output: “111”
Explantion: (-2) ^ 2 + (-2) ^ 1 + (-2) ^ 0 = 3

Input: 4
Output: “100”
Explantion: (-2) ^ 2 = 4

Note:

0 <= N <= 10^9

Code

1.

class Solution {
    public String baseNeg2(int N) {
        String res = "";
        while(N != 0){
            res = Integer.toString(N&1) + res;
            N = -(N >> 1);//负数的二进制是补码。-1左移1位还是-1,再取反,得1
        }
        return res == "" ? "0" : res;
    }
}

2.递归方法

 public String baseNeg2(int N) {
    if (N == 0 || N == 1) return Integer.toString(N);
    return baseNeg2(-(N >> 1)) + Integer.toString(N & 1);
}

3.更通用的方法

class Solution {
    public String baseNeg2(int N) {
        String res = "";
        int base = -2;
        while(N != 0){
            int remainder = N % base;
            N = N / base;
            if(remainder < 0){
            	//余数为负,说明商乘以base后的值比被除数大,此时应该将商加1,使乘积小于被除数,如此余数大于0
                remainder += Math.abs(base);
                ++N;
            }
            res = Integer.toString(remainder) + res;
        }
        return res == ""?"0":res;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值