class Case {
static int count1(int n) {
if (n == 0) {
return 0;
}
int m = n / 2;
if (2 * m != n) {
return 1 + count1(m);
}
return count1(m);
}
static int count0(int n) {
if (n == 0) {
return 1;
}
if (n == 1) {
return 0;
}
int m = n % 2;
return count0((n - m) / 2) + 1 - m;
}
static boolean equivalent(int n, int m) {
return ((count1(n) == count1(m)) && (count0(n) == count0(m)));
}
}
首先,我必须提一下,这份工作是数据分析师实习,唯一需要的语言是Python,而且我是一名物理系学生,所以对我来说“//”和“/”之间存在巨大差异。
我们首先考虑函数
count1
。我确实认为这是一个技巧问题,因为 int(2*m != n)
是一个技巧问题,因为它可能会导致值错误(我的错是因为我已经多次被警告关于物理中“//”和“/”之间的差异,我完全忘记了在其他语言中“7”可以用于整数除法,并带有向下取整除法的返回值。所以我愚蠢地认为这是一个棘手的问题,并立即指出这可能会给出错误消息,并且if(2*m !=n)
可能没有必要。
现在真正让我困惑的是
count0
,第二个函数。我只是指出该程序不能解决任何问题,没有模式。面试官说应该返回0或1,但是要返回0或1就应该是count0((n-m/2+1-m)
,即每个项都应该在括号内,对吗?
这次采访是在昨天晚上进行的。我是否应该写信给面试官并告诉他,尽管未能回答第一个函数的作用是我的错,但你的第二个函数可能有逻辑错误?当然以更好的方式。
PS:ChatGPT 告诉我这段代码是 Java,所以我添加了标签“java”。
正如我在上面的文字中所解释的。
我意识到我可能搞砸了第一个函数,但是这是使用 python 测试的测试结果:
# Implementing count0 function as described in the pseudocode
def count0(n):
if n == 0:
return 1
if n == 1:
return 0
m = n % 2
return count0((n - m) // 2) + 1 - m
# We will calculate the values of count0 for n = 0 to 20
results_count0 = {n: count0(n) for n in range(21)}
results_count0
结果:
{0: 1, 1: 0, 2: 1, 3: 0, 4: 2, 5: 1, 6: 1, 7: 0, 8: 3, 9: 2, 10: 2, 11: 1, 12: 2, 13: 1, 14: 1, 15: 0, 16: 4, 17: 3, 18: 3, 19: 2, 20: 3}
如果你看一些例子,你可以看到这种模式:
输入号码 | 输入二进制数 |
|
|
---|---|---|---|
0 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
2 | 10 | 1 | 1 |
3 | 11 | 0 | 2 |
4 | 100 | 2 | 1 |
7 | 111 | 0 | 3 |
8 | 1000 | 3 | 1 |
10 | 1010 | 2 | 2 |