LeetCode 算法:二进制数转字符串

313 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 29 天,点击查看活动详情

二进制数转字符串

原题地址

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

示例1:

 输入:0.625
 输出:"0.101"

示例2:

 输入:0.1
 输出:"ERROR"
 提示:0.1无法被二进制准确表示

提示:

  • 32位包括输出中的 "0." 这两位。
  • 题目保证输入用例的小数位数最多只有 6 位

思路分析

方法一

  1. 手动来转换二进制,小数转换成二进制的方法是 『乘2取整,顺序排列』
  2. 因此每次将 num*2,将整数存储起来,剩下的小数部分继续乘以2运算,一直到最后结果为0;
  3. 在计算过程中需要判断 res 的长度是否超过 30,若超过则返回 ERROR,否则返回 0.${res.join('')}

方法二

  1. 使用 Number.toString() 方法可以返回数字对应的字符串形式,该方法接收一个 radix 参数,该参数表示从数字到字符串转换的基数,如果未指定,则默认是为 10。我们平常用的最多的就是不传参数,然后默认按照十进制的方式返回;
  2. 了解了 API 后,我们可以将数字按照二进制的方式返回一个字符串;
  3. 题目中要求需要 32 位以内的二进制数,因此需要小数点后面的字符串长度是否超过30,若超过则返回 ERROR,否则返回对应的结果即可。

AC 代码

方法一

/**
 * @param {number} num
 * @return {string}
 */
var printBin = function(num) {
    const res = []
    while (num) {
        num *= 2
        const item = num >= 1 ? 1 : 0
        res.push(item)
        if (res.length > 30) return 'ERROR'
        num -= item
    }
    return `0.${res.join('')}`
};

结果:

  • 执行结果: 通过
  • 执行用时:60 ms, 在所有 JavaScript 提交中击败了 61% 的用户
  • 内存消耗:40.9 MB, 在所有 JavaScript 提交中击败了 55% 的用户
  • 通过测试用例:33 / 33

方法二

/**
 * @param {number} num
 * @return {string}
 */
var printBin = function(num) {
    const res = num.toString(2)
    return res.split(".")[1].length > 30 ? 'ERROR' : res
};

结果:

  • 执行结果: 通过
  • 执行用时:60 ms, 在所有 JavaScript 提交中击败了60.61%的用户
  • 内存消耗:41 MB, 在所有 JavaScript 提交中击败了18.18%的用户
  • 通过测试用例:33 / 33

END