2016-12-13 81 views
0

在面试问题中,我问了以下问题:这种方法的目的是什么?

以下方法的目的是什么?我们如何重写它?

public int question_1(int a, int b) 
{ 
    while (a > b) 
    { 
     a -= b; 
    } 
    return a; 
} 

在第一我认为这相当于A%B,但它不是,因为它是 “而(A> B)”,而不是 “而(A> = B)”。

感谢

+4

这些问题在面试时都有问题。铅笔和纸张,并尝试一些情况... –

+0

我认为它相当于'a%b' ...你真的测试过代码吗? –

+0

那么你回答了什么?也许关键是要看看你是否注意到了,并且会注意到'(n * m)%n'返回了'n'而不是'0'? –

回答

4

老实说,这是不可能通过阅读它的实现要知道方法的目的,即使我们假设它是无缺陷。

但是,我们可以通过记录自己的行为做起:

  • 如果b是肯定的:
    • 如果a是肯定的,该方法返回最小的正整数来全等ab。 (例如,给定1510,它将返回5;给出3010,它将返回10。)
    • 否则,该方法返回a
  • 如果b为零:
    • 如果a是肯定的,则该方法循环,​​直到永远。
    • 否则,该方法返回a
  • 如果b为负:
    • 如果ab,该方法返回a
    • 否则,该方法的行为取决于语言,因为它会增加a,直到它不再大于b。如果语言使用“环绕”规则定义整数运算,则该方法将循环很长时间,然后最终返回一个非常负数(除非b本身非常负,在这种情况下,取决于值a,函数可能会永远循环)。

和考虑到这些,我们可以推断,与零个负数的行为是不够离奇,该方法可能实际上只打算与正数来使用。因此,它的行为可以概括为:

  • 如果ab都是肯定的,那么该方法返回最小的正整数来全等ab

如果上述推断正确,那么该方法可以改写为:

public int question_1(int a, int b) { 
    if (a <= 0 || b <= 0) 
     throw new IllegalArgumentException(); 
    return (a - 1) % b + 1; 
} 
+0

a == 0可能是一个有效的输入 –

+0

@MattTimmermans:你是这么认为的?这对我来说似乎不太可能 - 如果'0'是一个有效的结果,那么当'a'是'b'的倍数时,为什么它会返回'b'而不是'0'? - 但我想我们无法确定。 (因此我的第一段:-P) – ruakh

1

我猜想,其目的是为了计算正整数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已经提供了这样一个认真考虑的答案时,我提供这个答案的原因是这是一个面试问题,所以最好如果你借此机会展示你如何在工作中解决这样的问题。

你并不想给人一个印象,那就是你会花很长时间和精力去仔细考虑这样一个简单的问题 - 如果你不得不花费很多精力去解决一个简单的问题,想象一下你会在一个大花上花费多少钱!

与此同时,您想要证明您认识到可能的错误,并主动修复错误或为未来的工程师腾出相同的任务。