美文网首页
编码求,给定一个整数,按照十进制的编码计算包含多少个 0

编码求,给定一个整数,按照十进制的编码计算包含多少个 0

作者: 溪桥星雨 | 来源:发表于2020-09-13 18:21 被阅读0次
    最近看到一个面试题,我能理解为【求一个给定的整数包含0的个数】吧?

    首先就是觉得,从个位开始寻找,找到最高位即可。但是具体不知道整数有多大。那就用递归最好了。

    //原理就是递归每个位查看是否有0的存在。类似于,如果一个N位数小于10的N-1次方,则必定存在一个0.这样递归累加即可计算出包含0的个数。递归结束的条件就是当N小于limtValue的时候。
    //参数n为要检测的整数,参数limtValue请固定为1.递归的时候需要使用limtValue,第一次务必为1
    //虽然可以使用static定义局部变量达到减少一个参数的目的,但是想了想,还是不用全局变量了。
    int getZeroCount(int n, int limtValue) {
        //取n的绝对值
        n = abs(n);
        //初始化一个计数变量,检测到一个0就置为1,进行递归累加
        int count = 0;
        //限定值,当前n如果小于limtValue,就可以结束函数了。每次递归都会将limtValue扩大10倍
        limtValue = limtValue * 10;
        //原理上面应该解释过了
        if ((n % limtValue) < (limtValue / 10)) {
            count = 1;
        }
        if (limtValue > n) {
            return count;
        }else {
            //拿到上次的结果累加
            int r = getZeroCount(n, limtValue);
            count = count + r;
            return count;
        }
    }
    

    看起来没问题,就是函数怪怪得,应该有更好的方式。或许已经接近真相了。

    //递归的从个位依次取出n的最后一位,看看是否为0,然后进行累加。
    int getZeroCount2(int n) {
        //取n的绝对值
        n = abs(n);
        //初始化一个计数变量,检测到一个0就置为1,进行递归累加
        int count = 0;
        //去掉最后一位后,递归的时候传进去
        int next = n / 10;
        //获得当前的最后一位,看看是否为0
        int z = n % 10;
        if (z == 0 ) {
            count = 1;
        }
        //如果下一个数为0了,说明这个数递归到了最高位了。可以结束了
        if (next == 0) {
            return count;
        }else {
            int r = getZeroCount2(next);
            count = count + r;
            return count;
        }
    }
    

    如此这般,既然是递归累加,何不一个一个的找一找进行累加,更容易理解,写出来也很简单。

    有什么错误,欢迎指出。目前感觉没有问题了。

    相关文章

      网友评论

          本文标题:编码求,给定一个整数,按照十进制的编码计算包含多少个 0

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