2009-06-28 39 views
8

我碰到這個問題javabat(http://www.javabat.com/prob/p183562)傳來:一個java實踐問題

我們希望使磚的一排 是目標英寸長。我們有一個小號磚(每個1英寸)和大號 磚(每個5英寸)的號碼 。如果 返回true,可以通過 從給定的磚塊中選擇目標。這 比看起來有點難, 可以完成沒有任何循環。

makeBricks(3,1,8)→真
makeBricks(3,1,9)→假
makeBricks(3,2,10)→真

我想出了這個解決方案:

public boolean makeBricks(int small, int big, int goal) { 
    if (goal > small + big * 5) 
     return false; 
    else if (goal % 5 == 0) 
     return goal/5 <= big; 
    else 
     return goal % 5 <= small; 
} 

這通過了測試。但我自己找到了一個反例:makeBricks(10,0,10) - > true。我的邏輯將返回false。我應該如何解決我的邏輯?還是有更好的方法來做到這一點?

+0

這當然是......實踐問題之一在一個Java和Python的學習網站上... codingbat.com – 2011-04-02 05:43:22

回答

17

我認爲你可以刪除你的第二個測試。我想試試這個:

public boolean makeBricks(int small, int big, int goal) { 
    if (goal > small + big * 5) 
     return false; 
    else 
     return goal % 5 <= small; 
} 
9

您的邏輯錯誤。這應該這樣做:

public boolean makeBricks(int small, int big, int goal) { 
    if (goal < 0 || big < 0 || small < 0) { 
    throw new IllegalArgumentException(); 
    } else if (goal > big * 5 + small) { 
    return false; 
    } else if (goal % 5 <= small) { 
    return true; 
    } else { 
    return false; 
    } 
} 

就足夠了。這可以簡化爲:

public boolean makeBricks(int small, int big, int goal) { 
    if (goal < 0 || big < 0 || small < 0) { 
    throw new IllegalArgumentException(); 
    } else { 
    return goal <= big * 5 + small && goal % 5 <= small; 
    } 
} 

當然,負面的目標,大或小沒有嚴格要求,但建議的完整性檢查。沒有這些檢查,結果可以簡單地得到:

public boolean makeBricks(int small, int big, int goal) { 
    return goal <= big * 5 + small && goal % 5 <= small; 
} 
+0

我不這麼認爲 - 例如,你的邏輯會對makeBricks(0,5,4)產生真實效果,在這種情況下,你實際上無法制作四英寸球門線只使用五英寸磚。 – Tim 2009-06-28 01:18:42

+14

恩,不,它不會。目標<=大* 5 +小?是。但是,目標%5是4.小是0,所以它返回false。請在錯誤地聲明它錯誤之前嘗試它。 – cletus 2009-06-28 01:24:37

1

它返回假的,因爲你的第二個檢查只比較它的大個子,這在你的反例,你有一個零。

so 2 < = 0是錯誤的。

這裏是做一個好辦法:但

return (Math.min(goal/5,big)*5 + small) >= goal; 

這樣你確定,你只需要使用盡可能多的大磚,沒有更多的,保證達到目標的唯一途徑是如果你有足夠的小磚塊。

3

第二個測試是完全沒有必要的。第一個檢查是否有足夠的總長度,並且都很好。

但第二個再次檢查您是否有足夠的總長度(返回目標/ 5 < = big;)但是這會忽略小磚塊添加的長度。問題是你正在檢查它是否是5的倍數,並自動假設你將只使用大塊磚塊。實際上,你可以使用五塊小磚塊。 (或者像你的例子中那樣,有10塊小磚塊)。最後一個檢查是正確的,假設你有足夠的長度,測試是否有足夠的粒度來獲得正確的長度。

1

我嘗試了一些其他場景:「makeBricks(8,1,13)」「makeBricks(1,2,6)」,其中你沒有足夠的或者太多的大塊磚,但是你需要一些。考慮到這兩種可能性,你會需要這樣的東西:

public boolean makeBricks(int small, int big, int goal) { 
    /* Not enough bricks to make the goal so don't bother */ 
    if (goal > small + big * 5) 
    return false; 

    /* How many big bricks can we use */ 
    int bigBricksToUse = Math.min(big, (goal/5)); 

    /* If we use that many bigs, do we have enough small */ 
    return goal - (bigBricksToUse * 5) <= small; 
} 
1

這裏還有一個實踐的問題,我認爲這是相當類似這樣的問題,只是想我會發布它,看看它是否適合人羣:

給予你一個int SO開始 聲望和一個高於首發聲望的整數SO目標聲望。 你只回答問題,所以你可以 獲得聲望只有10或 15.你也可以投票,所以你也可以失去聲望1。什麼是 你應該失去的信譽的最低數額達到目標 聲譽?

例如: 您開始使用715和要達到888答案是2

增加挑戰改變整數爲long不使用循環。

1

這是我最初的答案;它並沒有爲其他測試工作,但當時我無法弄清楚它不是如何(仍然真的不能),並且正確的答案讓我感到厭煩,因爲即使它檢查出它吸取它的球實際上是有效的,因爲某個陳述是錯誤的。咆哮咆哮咆哮,以及任何在此方式:

 
public boolean makeBricks(int small, int big, int goal) {

if(goal<=((big*5)+small) && goal%(big*5)<=small){ return true; } return false; }

正確答案在這裏,但它可以吸它:如果小爲> =餘數,它應該是真實的

 
public boolean makeBricks(int small, int big, int goal) {

if(goal<=((big*5)+small) && goal%5<=small){ return true; } return false; }

,並且永遠是,如果不是,那麼它就不會是真的。爲什麼我的方式行不通,這種方式的缺陷是什麼?是的,前面的陳述(目標< =((big * 5)+ small))剔除了它不起作用的所有實例,但是我做了這個覆蓋語句來取消任何不等於英寸總數的錯誤,不是爲了這個目的,我從迄今爲止所有數學科目中的舊數學問題中推導出來,它以最簡單的形式分解爲:w =(ax + bx)其中w =整數a =數字(in這種情況5)值大於由b表示的數字(在這種情況下爲1)的操作,並且x是在這個幾何代數問題中最合適地找到的兩個值之間的LCF(在這種情況下爲1),角度是36度大於兩倍的補充角度(x = 2(180-x)+36; x = 396-2x; 3x = 396; x = 132)。通常給出一組數量的提示,但不僅僅是變量。我的問題是什麼,它不起作用的地方在哪裏?

0

這是我的答案。

private static boolean makeBricks (int small, int big, int goal) { 

    return ((big * 5 + small) >= goal) && (goal % big <= small); 
} 
+0

歡迎來到Stack Overflow!你會考慮增加一些敘述來解釋爲什麼這段代碼有效嗎?是什麼使它成爲這個問題的答案? – 2012-05-11 02:29:33

0
private boolean makeBricks (int small, int big, int goal) { 
    return !(big*5 + small < goal || small < goal%5); 
} 

僅使用布爾運算符來檢查沒有這兩個失敗的案例!(fail || fail)。明顯的,磚塊不足以使目標big*5 + small < goal。當目標不是5的球偶數時,不太明顯,不足夠的小磚塊。

0

公共類磚{

public boolean checkMethod(int small, int big, int goal) { 
    if (goal <= small + big * 5 && goal >= big * 5) { 
     return true; 
    } else 
     return false; 
} 

public static void main(String args[]) { 
    Bricks brick = new Bricks(); 
    System.out.println(brick.checkMethod(10, 0, 10)); 
} 

}

0
private boolean makeBricks(int small, int big, int goal) 
{ 
    if (goal < 0 || big < 0 || small < 0) 
    { 
     throw new IllegalArgumentException(); 
    } 
    else return goal - (5 * big + small) <= 0; 
} 

這是它。這是如何完成的。

0

這裏是完美的解決方案:

public static boolean makeBricks(int small, int big, int goal) { 

    int totalInches = small + big*5; 
    if(totalInches < goal){ 
     return false; 
    } 

    int bigInches= big*5; 
    int smallRequired = goal %5; 

    if(smallRequired > small && bigInches != goal){ 
     return false; 
    }else if(smallRequired <=small){ 
     if(bigInches >= goal || smallRequired + bigInches == goal || small +bigInches ==goal 
       || small+ bigInches == goal){ 
      return true; 
     }if(bigInches + small > goal){ 
      if(small > goal-bigInches){ 
       return true; 
      } 
     } 

    } 
    return false; 
} 
0

恐怕沒有完美的解決方案,但也許有點更容易理解比以往:

public boolean makeBricks(int small, int big, int goal) { 
    //not testing for invalid input - no invalid input from codingbat.com (in this case) 

    int obviousDemandSmall = goal%5; 
    if (obviousDemandSmall>small) return false; 

    boolean needSmallToMakeUpForBig = (goal/5>big) ? true : false; 
    if (!needSmallToMakeUpForBig) return true; 

    int superfluousSmallFromFirstGlance = small-obviousDemandSmall; 
    int extraSmallCanMakeThisManyBig = superfluousSmallFromFirstGlance/5; 
    int missingBig = goal/5-big; 
    if (extraSmallCanMakeThisManyBig>=missingBig) return true; 

    return false; 
} 
0
if (goal < 0 || big < 0 || small < 0) { 
      throw new IllegalArgumentException(); 
     } else { 
      int reqBig = goal/5; 
      int reqSamll = goal % 5; 

      if (reqBig <= big && reqSamll <= small) 
       return true; 
      else if (reqBig > big) { 
       int remainingLen = goal - (big * 5); 
       if (remainingLen <= small) 
        return true; 
       else 
        return false; 
      } else 
       return false; 
     } 
0

你也可以試試這個:

public boolean makeBricks(int small, int big, int goal) { 
return goal - big * 5 <= small 
     && goal % 5 <= small; 
}