我之前在Leetcode练习时遇到了这个问题:
给定一个整数 num,返回 num 中除 num 的不同数字的个数。 如果 nums % val == 0,则整数 val 可以整除 nums。
我想出了以下方法,尽管它运行了一些示例测试用例,但当我提交它时,它无法清除诸如 54 之类的测试用例,其中输出应该为 0,但我的代码输出为 1。
class Solution {
public:
int countDigits(int num) {
set<int> s;
while (num > 0)
{
int lastdigit = num % 10;
if (num % lastdigit == 0)
{
s.insert(lastdigit);
}
num /= 10;
}
if (s.empty()) {
return 0;
} else {
return s.size();
}
}
};
我已附上我的代码供参考,请帮我找出我在哪里犹豫不决。
问题是您正在更改
num
,但是当您进行测试 num % lastdigit == 0
时,您希望使用 num
的原始值。
如果输入的数字为零,您的代码也会因被零除错误而失败,如果
num % lastdigit
为零,则 lastdigit
不合法。
也不需要测试空集,如果
s.size()
为空,你认为 s
会返回什么?
这是固定代码
class Solution {
public:
int countDigits(int num) {
set<int> s;
int n = num;
while (n > 0)
{
int lastdigit = n % 10;
if (lastdigit != 0 && num % lastdigit == 0)
{
s.insert(lastdigit);
}
n /= 10;
}
return s.size();
}
};
还有一个可能的问题,
44
应该返回什么?如果您认为答案是 2,那么您的代码还有另一个错误,因为 4 不会被添加到集合中两次。如果这是一个问题,您应该使用整数变量来计算位数。像这样
class Solution {
public:
int countDigits(int num) {
int count = 0;
int n = num;
while (n > 0)
{
int lastdigit = n % 10;
if (lastdigit != 0 && num % lastdigit == 0)
{
++count;
}
n /= 10;
}
return count;
}
};