【LeetCode】每日一题 面试题 05.02. 二进制数转字符串

75 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第21天,点击查看活动详情

面试题 05.02. 二进制数转字符串

二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示,则打印“ERROR”。

「示例1:」
 输入:0.625
 输出:"0.101"
「示例2:」
 输入:0.1
 输出:"ERROR"
 提示:0.1无法被二进制准确表示
「提示:」
32位包括输出中的 "0." 这两位。
题目保证输入用例的小数位数最多只有 6

解题思路

// 第一种
小数的二进制是每次乘2,取小数的部分,如果数为零停止,同时加入32这个终止条件
​
// 第二种
模拟手动将十进制小数转化为二进制
每次将num乘以2,将整数部分取出,剩下的小数部分继续进行同样操作。一直到num0
还要判断小数数部分是否超过32个
​
// 第三种
这道题考察的是浮点数的二进制表示。整数部分我们是除二取余,而小数部分是乘二取整。这里就是不断对 num 做乘二取整的操作,一直到 str 长度超过 32 位,或者 num 变成 0。
​
// 第四种
res初始化为"0."
在满足位数要求的情况下,当num大于0时,循环
先将num乘以2,将乘积赋值给numnum的个位(01),将对应的字符加入res的末尾
截取num的小数部分,作为num的新值
最后判断,当num0时(即res已经精确地表达了num),返回res
否则,返回"ERROR"
​
二进制数转字符串!!

代码实现

// 第一种
/**
 * @param {number} num
 * @return {string}
 */
var printBin = function(num) {
    let count = 1;
    let res = "0."
    while (num != 0) {
        if (num * 2 >= 1) {
            res = res + 1
            num = num * 2 - 1
        } else {
            res = res + 0
            num = num * 2
        }
        count += 1
        if (count >= 32) {
            res = "ERROR";
            break;
        }
    }
    return res;
};
​
// 第二种
const printBin = num => {
    const digits = [];
    while (num) {
        num *= 2;
        const digit = num >= 1 ? 1 : 0;
        digits.push(digit);
        if (digits.length > 32) return 'ERROR';
        num -= digit;
    }
    return `0.${digits.join('')}`;
};
​
// 第三种
/**
 * @param {number} num
 * @return {string}
 */
var printBin = function(num) {
    let str = '0.'
    while (str.length < 32 && num !== 0) {
        num *= 2
        if (num >= 1) {
            str += 1
            num -= 1
        } else {
            str += 0
        }
    }
    if (num === 0) {
        return str
    }
    return 'ERROR'
};
​
// 第四种
var printBin = function(num) {
    let res="0.";
    if(num >= 1 || num<=0)return "ERROR";
    let cnt=2;
    while(num > 0){
        num *=2;
        dig=num>=1?1:0;
        res+=dig;
        cnt++;
        num = num - dig;
        if(num == 0)return res;
        if(cnt >= 32)return "ERROR";
    }
    return "ERROR";
​
};

如果你对这道题目还有疑问的话,可以在评论区进行留言;