原题目
面试题 05.02. 二进制数转字符串
二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字不在0和1之间,或者无法精确地用32位以内的二进制表示,则打印“ERROR”。
示例1:
输入:0.625
输出:"0.101"
示例2:
输入:0.1
输出:"ERROR"
提示:0.1无法被二进制准确表示
提示:
- 32位包括输出中的"0."这两位。
第一次解法
二进制小数点后权重依次为0.5
, 0.25
, 0.125
, …
从左至右遍历,依次比较num与当前位权重weight
-
若num >= weight : 在字符串后加"1",同时num -= weight;
-
若num < weight : 在字符串后加"0"
代码如下:
class Solution {
public String printBin(double num) {
String resStr = "0.";
int i = 1;
while (num != 0 && resStr.length() <= 32) {
double weight = Math.pow(2, -i);
if (num >= weight) {
num = num - weight;
resStr += "1";
}
else {
resStr += "0";
}
i++;
}
return num == 0 ? resStr : "ERROR";
}
}
第二次解法
由于算法中需要频繁更新字符串,所以采用StringBuilder效率会更高。
class Solution {
public String printBin(double num) {
StringBuilder resStr = new StringBuilder("0.");
int i = 1;
while (num != 0 && i <= 30) {
double weight = Math.pow(2, -i);
if (num >= weight) {
num -= weight;
resStr.append("1");
} else {
resStr.append("0");
}
i++;
}
return num == 0 ? resStr.toString() : "ERROR";
}
}
小结
- 字符串需要频繁更新时,请考虑StringBuilder。