Проблема практики Java - PullRequest
       43

Проблема практики Java

9 голосов
/ 28 июня 2009

Я сталкивался с этой проблемой в Джавабате

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

makeBricks (3, 1, 8) → true
makeBricks (3, 1, 9) → false
makeBricks (3, 2, 10) → true

Я придумал это решение:

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. Моя логика вернет ложь. Как мне исправить мою логику? Или есть лучший способ сделать это?

Ответы [ 16 ]

0 голосов
/ 29 января 2017

Возможно, нет идеального решения, но, возможно, немного более понятно, чем предыдущие:

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 голосов
/ 09 июля 2016

Вот идеальное решение:

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 голосов
/ 18 марта 2015
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 голосов
/ 14 октября 2014

Кирпичи публичного класса {

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 голосов
/ 21 декабря 2013
private boolean makeBricks (int small, int big, int goal) {
    return !(big*5 + small < goal || small < goal%5);
}

Использует только логические операторы для проверки отсутствия обоих случаев сбоя !(fail || fail). Очевидное, недостаточно кирпичи, чтобы сделать цель big*5 + small < goal. Менее очевидно, недостаточно маленьких кирпичей, когда цель не кратна 5 small < goal%5.

0 голосов
/ 10 мая 2012

Это мой ответ.

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

    return ((big * 5 + small) >= goal) && (goal % big <= small);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...