2013-11-12 3 views
6

Проблема здесь кодирования летучей мыши Java заставила меня растянуть немного:пример кода Java обзор (makeChocolate в codingbat)

Проблема:

Мы хотим, чтобы сделать пакет целевых килограммов шоколада. У нас есть небольшие бары (по 1 килограмм каждый) и большие бары (по 5 килограммов каждый). Верните количество маленьких баров, чтобы использовать, предполагая, что мы всегда используем большие бары перед небольшими барами. Возврат -1, если это невозможно.

makeChocolate (4, 1, 9) → 4 makeChocolate (4, 1, 10) → -1 makeChocolate (4, 1, 7) → 2

http://codingbat.com/prob/p191363

я мог придумать с этим в качестве решения, я не уверен, что это лучший способ, который любой энтузиаст хотел бы рассмотреть, с большим удовольствием! Я напечатал это без компилятора или что-нибудь так, простите меня за углубления:

ЛЮБОГО ЛУЧШЕ ОТВЕТЫ БЫ ОЦЕНЕНЫ:

public int makeChocolate(int small, int big, int goal) { 
    if(goal<5&&small>=goal) 
    { 
    return goal; 
    } 

    if(goal<5&&small<goal) 
    { 
    return -1; 
    } 

    if(goal>=5) 
    { 
    if(5*big>goal) 
    { 
     int temp=goal/5; 
     if(goal-temp*5<=small) 
     { 
     return goal-temp*5; 
     } 
     if(goal-temp*5>small) 
     { 
     return -1; 
     } 
    } 

    if(5*big<goal) 
    { 
     if(small<(goal-5*big)) 
     { 
     return -1; 
     } 
     if(small>=(goal-5*big)) 
     { 
     return goal-5*big; 
     } 
    } 
    } 
    return 0;  
} 
+2

Side Примечание: Не используйте магические числа, изменение '5' быть какой-то постоянный со значимым именем. – Maroun

+0

Слишком много вложенных операторов 'if' являются признаком того, что должен быть метод обработки логики. Я правильно назвал метод, который также дал бы больше значения для кода, который облегчит его впитывание. – Bart

+0

Почему бы просто не проверить smallBar = GOAL_KILO% BIG_BAR – Infested

ответ

19
private final int BIG_SIZE = 5; 

public int makeChocolate(int small, int big, int goal) { 
    int s = goal - Math.min(big, goal/BIG_SIZE) * BIG_SIZE ; 
    return (s <= small) ? s : -1; 
} 

Объяснение:

goal/BIG_SIZE вычисляет общее количество больших баров обязательный. Конечно, это может быть больше, чем у нас, поэтому Math.min(big, goal/BIG_SIZE) ограничит это число до big (количество больших баров у нас есть).

Если мы умножим это число на размер большой полосы (5 килограммов) и вычтем от goal, мы получим количество оставшихся килограммов, заполненных небольшими барами (s).

Вторая строка просто проверяет, есть ли у нас достаточно маленьких баров. Если да, то s - результат, если нет, мы не можем сделать этот шоколад (-1).

+0

@ZongZhengLi Извините, вы правы. Я добавил объяснение. – isnot2bad

+0

,,,, Хороший ответ !! – Anirudh

0
private final int BIG_SIZE = 5; 

public int makeChocolate(int small, int big, int goal) 
{ 
    if(big > 0 && goal >= BIG_SIZE) 
     return makeChocolate(small, --big, goal-BIG_SIZE); 

    return (small >= goal ? goal : -1); 
} 

Краткое объяснение:

В то время как мы все еще можем использовать большой шоколад (т.е. #big> 0 & & цель> BIG_SIZE), вызов метода рекурсивно сбросив одну большую шоколадку и BIG_SIZE цели.

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

+0

Копирование/Вставка. Исправлено – Harry

+1

Исключение: java.lang.StackOverflowError (номер строки: 4) – Anirudh

+0

Рекурсия действительно нужна? : -s – Anirudh

4
private final int BIG_SIZE = 5; 

public int makeChocolate(int small, int big, int goal) { 
    // 1 
    while (goal >= BIG_SIZE && big >= 1) {goal -=BIG_SIZE; big -= 1;} 
    // 2 
    return goal <= small ? goal : -1; 
} 

Я думаю, что это прозрачный раствор:

  1. Используйте все большие конфеты
  2. Проверьте, если у нас достаточно маленький шоколад и возвращаемое значение
+0

Вы можете просто пропустить первый тест. – isnot2bad

+0

Мой код работает. Он просто бросает StackOverflowError для очень большого количества шоколада ... – Harry

+0

Если он не работает для каждого случая, он не работает :) Рекурсия не должна использоваться в этой задаче – alicjab

2

Вот простое решение, использующее только логическая логика и простая математика. После обнаружения случаев сбоя цели проблему проще решить.

public int makeChocolate(int small, int big, int goal) { 
    big *= 5; 
    if (big + small < goal || small < goal%5) 
     return -1; //goal can not be met 
    small = goal - big; //use big bars first 
    return small < 0 ? (big+small)%5 : small; 
} 
+0

, вероятно, является допустимым решением, но все же лучше изложить свои предположения о том, почему –

+0

Он проходит все тесты. Какая часть кажется сложной? – dansalmo

+0

ничего сложного - но всегда полезно дать ответ, в котором, по крайней мере, кратко изложены ваши предположения. Вы отвечали, что флаг некачественный, потому что вы этого не сделали. см. часто задаваемые вопросы и мета –

1

Вот мое решение, используя While-цикл (вместо вызова метода рекурсивно):

public int makeChocolate(int small, int big, int goal) { 
    while (goal >=5 && big>0) { 
    goal -= 5; 
    big--;  
    } 
    if (goal<=small) { 
    return goal; 
    } 
    else return -1; 
} 

1.Substract 5 до тех пор, пока остальные от 0 до 4 включительно.

2.Stop вычитание, если количество больших баров исчезло.

3. проверьте, хватит ли маленьких баров для достижения цели.

4.Return остальное, в противном случае -1

1
public int makeChocolate(int small, int big, int goal) { 
    int nbSmallNeeded; 
    int nbBigNeeded = Math.abs(goal/5); 
    if(big >= nbBigNeeded){ 
     nbSmallNeeded= goal - nbBigNeeded*5; 
    } 
    else { 
     nbSmallNeeded = goal - 5*big; 
    } 
    return small >= nbSmallNeeded? nbSmallNeeded: -1; 
} 
+0

Доступны более сжатые решения, но не плохие. – Anirudh

0
public int makeChocolate(int small, int big, int goal) 
{ 
    int b=big*5; 
    if(b>0 && b+small>=goal && goal%5<=small || small>=goal) 
    { 
    while(goal>=5 && b>0) 
    { 
    goal-=5; 
    b-=5; 
    } 
    return goal; 
    } 
    return -1; 
} 

«тогда», чтобы проверить, есть достаточно большие и маленькие шоколадки, и «пока», чтобы избавиться от нужного количества большие конфеты

0
public int makeChocolate(int small, int big, int goal) { 

//fail number 1 -- not enough chocolate to reach the goal. 
if(goal > big*5 +small) return -1; 

//fail number 2 -- not enough small ones to fill the remaining. 
if(goal%5 > small) return -1; 

//fail number 3 -- not enough big ones 
if(goal - big*5 >=5) return goal-big*5; 

return goal%5; 
} 

Я считаю, что codingbat пытается решить эту проблему без использования какой-либо формы петли только если заявления, как с его предыдущим MakeBrics упражнения. Его стратегия заключается в том, чтобы найти простые способы проверки отказа. Простой способ взглянуть на это - увидеть это как процесс скрининга.

Fail 1 - Нет смысла пытаться рассчитать, сколько нам нужно, если у нас не будет достаточно шоколада для начала. Это требует времени и неэффективно.

Сбой 2 - Мы проверяем наличие достаточного количества небольших баров, чтобы заполнить оставшееся пространство. Если это не операция прекращения, так как нет смысла рассчитывать дальше.

Fail 3 - В случае, когда у нас недостаточно больших, чтобы слепо опираться на операцию модуля внизу, принимали ли они бесконечные большие, поэтому он дает только отдых, нам нужно только проверить, сколько мы имеют большие. Поскольку провал №1 прошел, мы знаем, что у нас достаточно шоколада, чтобы заполнить заказ, поэтому все, что нам нужно сделать, это суммировать большие, а затем вычесть из цели, которая оставляет нам правильный ответ маленьких.

0
public int makeChocolate(int small, int big, int goal) { 
    int goalDiv = goal/5; 
    int goalRem = goal % 5; 

    // Equal or more big bars, and small bars available 
    if (goalDiv <= big && goalRem <= small) 
    return goalRem; 

    // Not enough big bars, but more than goal when combined with small bar 
    if (goalDiv > big && (big * 5 + small >= goal)) 
    return goal - (big * 5); 

    return -1; 
} 
0
public int makeChocolate(int small, int big, int goal) { 
    if(goal > (big * 5)) 
    { 
    if((goal - 5 * big) <= small) return goal - 5 * big; 
    } 
    else 
    { 
    if(goal % 5 <= small) return goal % 5; 
    } 
    return -1; 
} 
+0

Было бы полезно добавить некоторые пояснения к вашему коду, чтобы ассер и другие знали, что он делает и как он решает проблему :-) – JonasCz

0

Вот мой код:

public int makeChocolate(int small, int big, int goal) { 

    goal=goal-big*5; 

    while(goal<0){ 
     goal+=5; 
    } 

    if(small>=goal){ 
     return goal; 
    } 
    else{ 
     return -1; 
    } 

} 
0
public int makeChocolate(int small, int big, int goal) { 
    if(goal/5 <= big) 
     goal = goal - (goal/5)*5; 
    else 
     goal = goal - big*5; 
    if(goal <= small) 
     return goal; 
    return -1; 
} 
0
public int makeChocolate(int small, int big, int goal) { 
    int bigs = big*5; 
    while(bigs > goal) { 
    big--; 
    bigs = big*5; 
    } 
    int compare = goal - bigs; 
    if(small >= compare) return compare; 
    if(small < compare) return -1; 
    return small; 
} 
+1

Ухаживать за этим сбрасыванием кода? – RamenChef

0
public int makeChocolate(int small, int big, int goal) { 

int big_amount = 0; 

for (int x = 1; x * 5 <= goal; x++){ 
    if (big > big_amount) 
    big_amount++; 
} 

    if (goal - big_amount*5 > small) 
    return -1; 
    else 
    return goal - big_amount*5; 
} 
+0

Прошу вас, пожалуйста, добавить еще немного контекста вокруг вашего ответа. Кодовые или ссылки только ответы трудно понять. Это поможет читателю и будущим читателям, если вы сможете добавить дополнительную информацию в свой пост. – RBT

+0

объясните свой ответ, как он сможет решить проблему OP. –

0
public int makeChocolate(int small, int big, int goal) { 
    // Condtion When Fails 
    if (goal > 5 * big + small || goal % 5 > small) { 
     return -1; 
    } 

    if (goal > 5 * big) { 
     return (goal - 5 * big); 
    } else { 
     return (goal % 5); 

    } 

} 
+1

Можете ли вы добавить небольшое описание своего ответа для будущих читателей, чтобы понять ваш код? в примере: что вы улучшили, почему? – goto

Смежные вопросы