开启掘金成长之旅!这是我参与「掘金日新计划 · 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();
}
}