美文网首页
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