2016-12-13 18 views
0

インタビューの質問では、私は次のように尋ねました:このメソッドの目的は何ですか?

どのような目的のために、どのように書き直すことができますか?まず

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

私はそれ%のBに相当し、それは "(A> B)、一方" としない "ながら(A> = B)" であるので、それはないと思いました。

おかげ

+4

これらの種類の質問がインタビューで尋ねられる理由があります。鉛筆と紙を試してみて、いくつかのケースを試してみてください... –

+0

私はそれが 'a%b'と同じだと思います...実際にコードをテストしましたか? –

+0

それであなたは何を答えましたか?おそらくポイントはあなたが注意を払っているかどうかを確認することでしたし、 '(n * m)%n'が' n'を返し、 '0'を返していないことに気づくでしょうか? –

答えて

4

正直なところ、それは我々がそれはバグのないだと仮定した場合でも、ちょうどその実装を読むことによって、法の目的を知ることは不可能です。

しかし、私たちはその行動を文書化することから始めることができます。bが正である

  • 場合:正である
    • a場合は、この方法は、a剰余bに合同である以上、正の整数を返します。 (例えば、1510与えられ、それは5が返され; 3010与えられ、それは10が返される)
    • そうでない場合、方法はaを返します。
  • bの場合はゼロです:
    • aが正の場合、この方法は永遠にループします。
    • それ以外の場合、このメソッドはaを返します。
  • bが負の場合:
    • ab場合、方法はaを返します。
    • それ以外の場合、メソッドの動作は言語に依存します。は、bよりも長くなるまで、aを増加させるため、言語によって異なります。言語が "ラップアラウンド"ルールを使用して整数算術を定義している場合、メソッドは長時間ループしてから最後に非常に負の数を返します(bはそれ自体が非常に負でない場合はaの値に応じて関数永遠にループするかもしれない)。

及びこれらを考えると、我々はゼロと負の数と行動は方法は、おそらく実際には正の数と一緒に使用するためのものであることを十分に奇妙であることを推測することができます。そうその挙動のように要約することができる。abが共に正である場合

  • 、この方法はaモジュロbに合同である以上の正の整数を返します。

上記の推論が正しい場合、この方法はのように書き換えることができます。私は、その目的は、正のint型のため%bを計算することであることを推測し、それがバグを持っていることでしょう

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

== 0はおそらく有効な入力です –

+0

@MattTimmermans:あなたはそう思いますか? '0'が有効な結果ならば、' a'が 'b'の倍数であるとき' 0'ではなく 'b'を返すのはなぜですか?私は確かにわからないと思う。 (したがって、私の最初の段落: - P) – ruakh

1

これを本番で見た場合、question_1(n、n)== nが本当にであるかどうかを確認する必要があります。もしそうなら、なぜそうであるかを示すコメントを追加したいと思います。さもなければ私はそれを修正するだろう。

いずれの場合も、ループではなく%演算子を使用するように書き換えられます。それが正しいなら、このように書き換えることができます

public int question_1(int a, int b) 
{ 
    if (a>b) 
    { 
     a = ((a-1)%b) + 1; 
    } 
    return a; 
} 

これは、負の数の取り扱いでは同じではありません、しかし、そう再度、あなたはそれはOKだことを確認するためにチェックする必要があると思います。

@ruakhがすでにこのような慎重に検討されている回答を提供している理由は、これはインタビューの質問であるため、仕事上どのようにこのような問題にアプローチするかを示す。

あなたは、あなたが長い時間を費やしてこのような単純な問題について慎重に考える努力をしているという印象を与えたくはありません。単純な問題を解決するために多くの努力を費やさなければならない場合は、あなたは大きなものに何を費やすでしょう!

同時に、可能性のあるバグを認識し、それを修正したり、将来のエンジニアに同じタスクを任せたりすることを実証する必要があります。

関連する問題