2012-03-19 3 views
0

Я, очевидно, не хватает «если» заявление, но я не уверен, как покрыть, если чай или конфеты не удваивать друг от друга:Java CodingBat Logic teaParty?

Java > Logic-1 > teaParty

Мы имеем партию с количеством чая и конфеты , Верните исходный результат партии, закодированный как 0 = плохой, 1 = хороший или 2 = большой. Партия хороша (1), если и чай, и сладости не менее 5. Однако, если чай или конфеты как минимум удваивают количество другого, вечеринка великолепна (2). Однако во всех случаях, если чай или конфеты меньше 5, партия всегда плохая (0).

teaParty(6, 8) → 1 
teaParty(3, 8) → 0 
teaParty(20, 6) → 2 

Вот код, который я до сих пор:

public int teaParty(int tea, int candy) { 

    if(tea < 5 || candy < 5) 
    return 0; 

    if(tea == 5 && candy == 5) 
    return 1; 

    if(tea != 5 && candy != 5) 
    return 1; 

    if(candy * 2 >= tea) 
    return 2; 

    if(tea * 2 >= candy) 
    return 2; 


return 0; 
} 

Эти ошибки я получаю:

Expected This Run   
teaParty(6, 8) → 1 1 OK  
teaParty(3, 8) → 0 0 OK  
teaParty(20, 6) → 2 1 X  
teaParty(12, 6) → 2 1 X  
teaParty(11, 6) → 1 1 OK  
teaParty(11, 4) → 0 0 OK  
teaParty(4, 5) → 0 0 OK  
teaParty(5, 5) → 1 1 OK  
teaParty(6, 6) → 1 1 OK  
teaParty(5, 10) → 2 2 OK  
teaParty(5, 9) → 1 2 X  
teaParty(10, 4) → 0 0 OK  
teaParty(10, 20) → 2 1 X  
other tests 
X  
+2

Я понятия не имею, о чем этот вопрос. –

+0

как вы можете ожидать '1', когда' teaParty (5, 9) '? – talnicolas

+0

Я не уверен, что вы спрашиваете, но я подозреваю вас в вашем втором заявлении 'if'. Только вызовы, где именно одно из значений - 5 (но не оба), никогда не пройдут мимо этого утверждения, что, похоже, не является вашим намерением. – VeeArr

ответ

0
teaParty(20, 6) → 2 1 X  
teaParty(12, 6) → 2 1 X 

Эти два стреляют, как 1, так как ни равных 5. Они срабатывают от

if(tea != 5 && candy != 5) 
    return 1; 

Что касается

teaParty(5, 9) → 1 2 X 

Это стреляет, потому что она проходит «пять проверок», которые возвращают 1, и конфеты * 2 (который 10) больше, чем чай (который 9), поэтому она попадает

if(candy * 2 >= tea) 
    return 2; 

Однако у вас нет надобности задавать вопросы здесь. Какова ваша цель? Можете ли вы предоставить больше контекста? Возможно, мы сможем использовать это, чтобы найти истинную ошибку, а не только симптомы.

0

Я могу объяснить, почему вы получаете вывод, но я не знаю, чего вы хотите.

if(tea != 5 && candy != 5) 
return 1; 

Это если утверждение означает, что если оба чай и конфеты не 5, то возвращение 1. Это третье, если заявление вы так, чтобы получить здесь вы должны передать эти 2

if(tea < 5 || candy < 5) 
    return 0; 

    if(tea == 5 && candy == 5) 
    return 1; 

Так если чай и сладости будут больше или равны 5, это не сработает с первым, и если чай или конфеты не будут 5, это не даст второго.

в этих случаях

teaParty(20, 6) → 2 1 X  
teaParty(12, 6) → 2 1 X 
teaParty(10, 20) → 2 1 X  

чай = 20, 12, 10 все больше 5, а не 5 конфеты = 6, 20 все больше 5, а не 5 так что вы получите 3-ю, если

этот случай

teaParty(5, 9) → 1 2 X 

чай = 5 конфеты = 9

так что вы получите 4-й, если

if(candy * 2 >= tea) (9*2 >= 5) true 
    return 2; 
0

if(tea != 5 && candy != 5) выполняются до всех тестов, чтобы проверить, если один является двойным (по крайней мере) другим. Либо удалите этот оператор if, либо переместите его, чтобы вы могли выполнить двойные проверки. Что-то вроде:

if(tea < 5 || candy < 5) 
    return 0; 

if(tea == 5 && candy == 5) 
    return 1; 

if(tea != 5 && candy != 5) 
{ 
    if((candy * 2 >= tea) || (tea * 2 >= candy)) 
     return 2; 

    return 1; 
} 
+0

Вы должны попробовать свое решение [здесь] (http://codingbat.com/prob/p177181) и отправить его, который работает. – dansalmo

1

У вас есть избыточные и неправильные случаи. Вот более простой вариант:

public int teaParty(int tea, int candy) { 
    if(tea < 5 || candy < 5) // your first case was correct 
    return 0; 

    if(candy * 2 <= tea || tea * 2 <= candy) // must be <= not >= 
    return 2; 

    return 1; // after you handle the first two cases, just return 1 
} 
1

Ниже приведен код, если вы хотите простой компактное решение одной линии без использования IFS и в вашем коде некоторые условия проверяются избыточны, которые могут быть причиной ошибки

public int teaParty(int tea, int candy) 
{ 
    return (tea < 5 || candy < 5) ? 0: (tea >= 2 * candy || candy >= 2 * tea) ? 2 : 1; 
} 
+1

Справедливости ради, условный оператор '?' Практически такой же, как 'if ... else', поэтому вы используете' ifs'. Кроме того, следует принять самое простое и кратчайшее решение. – hamena314

0
public int teaParty(int tea, int candy) { 

    if (tea>=5 && candy>=5) { 
    if (tea>=candy*2 || candy>=tea*2) { return 2; } 
    else { return 1; } 
    } 
    return 0; 
} 

Надеюсь, это поможет. Более четкая логика.

0
public int teaParty(int tea, int candy) { 
    if (tea >= 5 && candy >=5) { 
    if (tea/candy >= 2 || candy/tea >= 2) { 
     return 2; 
    } 
    return 1; 
    } 
    return 0; 
} 
+1

Пожалуйста, добавьте описание вашего ответа. –