最近看到一个面试题,我能理解为【求一个给定的整数包含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;
}
}
如此这般,既然是递归累加,何不一个一个的找一找进行累加,更容易理解,写出来也很简单。
有什么错误,欢迎指出。目前感觉没有问题了。
网友评论