因爲你已經通過編寫自己的代碼善意的嘗試,因爲我看到這是一種困惑,我爲您提供下面只有一個遞歸調用的代碼,而不是像您的代碼中那樣進行兩次遞歸調用。
我認爲這是儘可能簡單,因爲它滿足約束。
它做什麼:它將兩個數字倒數爲零,並檢查哪一個先到達零。如果兩者同時達到零,則結果應該是錯誤的,但只需檢查y
是否已包含該檢查。
public static boolean isLessThan(int x, int y) {
if (y == 0) {
return false;
}
if (x == 0) {
return true;
}
return isLessThan(x - 1, y - 1);
}
@Andreas的答案比上面更有效率。我的目標最初是爲了一個簡短而乾淨的答案。 我試圖創建一個較短的移位方法。 儘管比計數例子更難掌握,但它具有更好的複雜性,並且與上述代碼具有相同數量的行(我不計算該常量,因爲我可以將代碼包含在代碼中以犧牲可讀性爲代價)。
請注意,此代碼左移而非右移,並且它首先檢查最重要的位。
public static final int HIGH_BIT = 1 << 31;
public static boolean isLessThan(int x, int y) {
if (x == y) {
return false;
}
if ((x & HIGH_BIT) != (y & HIGH_BIT)) {
return (y & HIGH_BIT) == HIGH_BIT;
}
return isLessThan(x << 1, y << 1);
}
注:如果!=
是不允許的,你可以改變第二if
聲明:
if (((x^y) & HIGH_BIT) == HIGH_BIT)
還要注意的是,複雜性確實是O(1)
因爲,雖然該算法是理論上O(log n)
,Java的int爲32位,因此上限爲O(32)
,與O(1)
相同。
你嘗試過這麼遠嗎? – JackVanier
是否允許按位運算符? –
public static boolean isLessThan(int x,int y){ \t \t if(x == y - 1)return true; \t \t if(x == y + 1)return false; \t \t if(x == y)return false; \t \t返回isLessThan((X),(Y-1))|| isLessThan((x-1),y); \t} –