在面試問題中,我問了以下問題:這種方法的目的是什麼?
以下方法的目的是什麼?我們如何重寫它?
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'? –