刷题的日常-二进制数转字符串

131 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 28 天,点击查看活动详情

刷题的日常-2023年3月2号

一天一题,保持脑子清爽

二进制数转字符串

来自leetcode的 面试题 05.02 题,题意如下:

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

示例1

输入:0.625
输出:"0.101"

示例2

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

理解题意

通过题意,我们可以将信息整理如下:

  • 题目给出一个 double 类型的数
  • 要求我们对给定的浮点数转换为二进制表示
  • 如果能够用32位字符串进行表示的话,返回转换后的字符串
  • 如果不能转换,返回 ERROR 字符串

做题思路

题目其实是考察我们对计算机编码的理解。对于每一个浮点数,小数部分的二进制表示可以通过小数部分一直乘以二,然后取整数部分的第一位即可。因为给定的浮点数只会介于 0 - 1 之间,那么我们就可以将小数部分操作,直到超过32位 或者 数字等于 0。

如果长度大于32,输出ERROR,否则,输出二进制表示。步骤如下:

  • 开辟一个 StringBuilder 用来构建结果
  • 当字符串小于32位 或者 是数字大于0,进入循环
  • 将原来的数 乘以 2
  • 然后取整数部分
  • 然后再减去整数的部分
  • 最后如果超过32位,返回 ERROR,否则返回结果

代码实现

代码实现如下:

public class Solution {
    public String printBin(double num) {
        StringBuilder sb = new StringBuilder("0.");
        while (sb.length() <= 32 && num > 0) {
            num = num * 2;
            sb.append((int) num);
            num -= ((int) num);
        }
        return sb.length() > 32 ? "ERROR" : sb.toString();
    }
}

image.png