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

2020-09-13  本文已影响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;
    }
}

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

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

上一篇下一篇

猜你喜欢

热点阅读