在面试问题中,我问了以下问题:这种方法的目的是什么?
以下方法的目的是什么?我们如何重写它?
public int question_1(int a, int b)
{
while (a > b)
{
a -= b;
}
return a;
}
在第一我认为这相当于A%B,但它不是,因为它是 “而(A> B)”,而不是 “而(A> = B)”。
感谢
在面试问题中,我问了以下问题:这种方法的目的是什么?
以下方法的目的是什么?我们如何重写它?
public int question_1(int a, int b)
{
while (a > b)
{
a -= b;
}
return a;
}
在第一我认为这相当于A%B,但它不是,因为它是 “而(A> B)”,而不是 “而(A> = B)”。
感谢
老实说,这是不可能通过阅读它的实现要知道方法的目的,即使我们假设它是无缺陷。
但是,我们可以通过记录自己的行为做起:
b
是肯定的:
a
是肯定的,该方法返回最小的正整数来全等a
模b
。 (例如,给定15
和10
,它将返回5
;给出30
和10
,它将返回10
。)a
。b
为零:
a
是肯定的,则该方法循环,直到永远。a
。b
为负:
a
≤ b
,该方法返回a
。a
,直到它不再大于b
。如果语言使用“环绕”规则定义整数运算,则该方法将循环很长时间,然后最终返回一个非常负数(除非b
本身非常负,在这种情况下,取决于值a
,函数可能会永远循环)。和考虑到这些,我们可以推断,与零个负数的行为是不够离奇,该方法可能实际上只打算与正数来使用。因此,它的行为可以概括为:
a
和b
都是肯定的,那么该方法返回最小的正整数来全等a
模b
。如果上述推断正确,那么该方法可以改写为:
public int question_1(int a, int b) {
if (a <= 0 || b <= 0)
throw new IllegalArgumentException();
return (a - 1) % b + 1;
}
a == 0可能是一个有效的输入 –
@MattTimmermans:你是这么认为的?这对我来说似乎不太可能 - 如果'0'是一个有效的结果,那么当'a'是'b'的倍数时,为什么它会返回'b'而不是'0'? - 但我想我们无法确定。 (因此我的第一段:-P) – ruakh
我猜想,其目的是为了计算正整数A%B,而且它有一个错误。
如果我在生产中看到这个,我将不得不检查这个函数的用法,看看question_1(n,n)== n是否为真的是正确。如果是这样,我会添加一个评论,说明为什么是这样。否则我会解决它。
无论哪种情况,它都可以被重写为使用%运算符而不是循环。如果这是正确的,它可以被改写这样的:
public int question_1(int a, int b)
{
if (a>b)
{
a = ((a-1)%b) + 1;
}
return a;
}
这不是在处理负数,但同样,如此反复,你不得不检查,以确保这行。
当@ruakh已经提供了这样一个认真考虑的答案时,我提供这个答案的原因是这是一个面试问题,所以最好如果你借此机会展示你如何在工作中解决这样的问题。
你并不想给人一个印象,那就是你会花很长时间和精力去仔细考虑这样一个简单的问题 - 如果你不得不花费很多精力去解决一个简单的问题,想象一下你会在一个大花上花费多少钱!
与此同时,您想要证明您认识到可能的错误,并主动修复错误或为未来的工程师腾出相同的任务。
这些问题在面试时都有问题。铅笔和纸张,并尝试一些情况... –
我认为它相当于'a%b' ...你真的测试过代码吗? –
那么你回答了什么?也许关键是要看看你是否注意到了,并且会注意到'(n * m)%n'返回了'n'而不是'0'? –