美文网首页
leetcode算法—[面试题 05.02]二进制数转字符串(中

leetcode算法—[面试题 05.02]二进制数转字符串(中

作者: 小胖学编程 | 来源:发表于2021-07-11 15:27 被阅读0次

面试题 05.02. 二进制数转字符串

image.png

1. 数学知识

本题是一个数学问题,即小数如何转换为二进制数。

百度百科定义.png

问题难点一:了解小数转换为二进制的定义。

2. 总结

思路:循环操作,每次num*2,判断是否大于等于1?true:则填充1,false则填充0,直至num为0时终止循环!

遇到的难题:

按照题目分析,0.1是无法转换为二进制的。因为 0.1->0.2->0.4->0.8->0.6->0.2->0.4....会一直循环下去。

那么不能转换为二进制的小数有什么规律呢?思维卡在这个误区。

2.1 使用缓存的思路

结题思路:将循环的num变量均缓存起来,然后判断num变量是否出现重复的情况。若出现重复则直接返回ERROR。

image.png

但是实际运行起来,出现了double精度的问题,导致num并不是0.6而是无限接近0.6,故使用缓存的思路是行不通的。

2.2 控制循环次数思路(官方思路)

题目中明确表示,若无法使用32位二进制表示,则打印error。

那么结束循环的条件:num为0或者循环的次数为32次。

class Solution {


    public String printBin(double num) {

        //缓存的数据

        StringBuilder sb = new StringBuilder("0.");
        int i = 0;
        boolean flag = false;
        while (num != 0) {
            if (num * 2 >= 1) {
                //填充1
                sb.append("1");
                //获取num值
                num = num * 2 - 1;
            } else {
                sb.append("0");
                num = num * 2;
            }
            //循环终止条件
            if (i++ == 32) {
                sb=new StringBuilder("ERROR");
                break;
            }
        }
        return sb.toString();
    }
}

相关文章

网友评论

      本文标题:leetcode算法—[面试题 05.02]二进制数转字符串(中

      本文链接:https://www.haomeiwen.com/subject/jtpkpltx.html