【程序员面试金典】【字符串】面试题 05.02 - 二进制数转字符串

一 目录

不折腾的前端,和咸鱼有什么区别

目录
一 目录
二 题目
三 解题思路
四 统计分析
五 解题套路

二 题目

二进制数转字符串。

给定一个介于0和1之间的实数(如0.72),
类型为 double,
打印它的二进制表达式。

如果该数字不在0和1之间,
或者无法精确地用32位以内的二进制表示,
则打印“ERROR”。

示例1:

 输入:0.625
 输出:"0.101"

示例2:

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

32位包括输出中的"0."这两位。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bianry-number-to-string-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
 * @param {number} num
 * @return {string}
 */
var printBin = function(num) {

};

根据上面的已知函数,小伙伴们可以先尝试破解本题,确定了自己的答案后再看下面代码。

三 解题思路

有 2 种解法:

  1. 利用 API

  2. 利用转换技巧


06:12 解法一:利用 API

const printBin = (num) => {
  const result = num.toString(2);
  if (result >= 1 || result <= 0 || result.length > 32) {
    return 'ERROR';
  }
  return result;
};

说起数学都想利用一番 API,要不然会头皮发麻。


10:48 解法二:暴力

const printBin = (num) => {
  let result = '0.';
  let i = 30;
  while (num > 0 && i--) {
    num *= 2;
    if (num >= 1) {
      result += '1';
      --num;
    } else {
      result += '0';
    }
  }
  return num !== 0 ? 'ERROR' : result;
};

由于题目要求 精确地用 32 位以内的二进制表示,并且 包括 0.,而且是 介于 0 和 1 之间的实数,所以我们利用十进制小数转换成二进制小数时的 乘 2 取整,顺序排列 法。

具体做法:

  1. 用 2 乘十进制小数,得到积

  2. 将积的整数部分取出,再用 2 乘于剩余的小数部分,得到下一个积

  3. 以此往复,直到积中小数部分为 0,或者达到 32 位精度

这种技巧将在 jsliang 的《十进制和二进制互相转换》中详细介绍。

具体地址可以咨询 jsliang

四 统计分析

本题不需要统计分析~

五 套路分析

本题套路:

  • 利用 JS 的数学 API 或者熟练十进制和二进制互相转换方法,可以破解这类题型。

如果小伙伴有更好的思路想法,或者没看懂其中某种解法,欢迎评论留言或者私聊 jsliang~


不折腾的前端,和咸鱼有什么区别!

jsliang 会每天更新一道 LeetCode 题解,从而帮助小伙伴们夯实原生 JS 基础,了解与学习算法与数据结构。

浪子神剑 会每天更新面试题,以面试题为驱动来带动大家学习,坚持每天学习与思考,每天进步一点!

扫描上方二维码,关注 jsliang 的公众号(左)和 浪子神剑 的公众号(右),让我们一起折腾!

jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值