在一次采访问题中,我被问到以下问题:
以下方法的目的是什么,我们如何重写它?
public int question_1(int a, int b)
{
while (a > b)
{
a -= b;
}
return a;
}
起初我认为它相当于%b,但它不是因为它是"而(a> b)"而不是"而(a> = b)"。
由于
答案 0 :(得分:4)
老实说,即使我们假设它没有错误,也不可能通过阅读它的实现来了解方法的目的。
但是,我们可以从记录其行为开始:
b
是肯定的:
a
为正,则该方法返回与a
模b
一致的最小正整数。 (例如,给定15
和10
,它将返回5
;给定30
和10
,它将返回10
。)< / LI>
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;
}
答案 1 :(得分:1)
我猜它的目的是为正整数计算一个%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已经提供了这样一个经过仔细考虑的答案时,我提供这个答案的原因是这是一个面试问题,所以如果你抓住机会展示你将如何解决这样的问题是最好的在工作中。
你真的不想让人觉得你会花很长时间和很多努力仔细思考这个简单的问题 - 如果你不得不花费那么多精力来解决一个简单的问题,想象一下你会花多少钱!
与此同时,您希望证明您认识到可能的错误,并主动修复它或为未来的工程师提供相同的任务。