面试中一段代码片段的混乱

问题描述 投票:0回答:1

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}
java floor-division
1个回答
2
投票

如果你看一些例子,你可以看到这种模式:

的结果 的结果
输入号码 输入二进制数
count0()
count1()
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
© www.soinside.com 2019 - 2024. All rights reserved.