原题目
面试题 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。
博客围绕面试题“二进制数转字符串”展开,给定0到1之间的实数,要求打印二进制表达式,若不在范围或无法用32位以内表示则输出“ERROR”。介绍了第一次解法,从左至右比较权重更新字符串,还指出第二次解法用StringBuilder可提高频繁更新字符串的效率。
708

被折叠的 条评论
为什么被折叠?



