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

Еще один генератор случайных цветов:

var randomColor;
randomColor = Math.random() * 0x1000000; // 0 < randomColor < 0x1000000 (randomColor is a float)
randomColor = Math.floor(randomColor); // 0 < randomColor <= 0xFFFFFF (randomColor is an integer)
randomColor = randomColor.toString(16); // hex representation randomColor
randomColor = ("000000" + randomColor).slice(-6); // leading zeros added
randomColor = "#" + randomColor; // # added
9
задан fei 28 June 2009 в 01:00
поделиться

6 ответов

I think you can just remove your second test. I would try this:

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

The first test just checks how long the row would be if we just put all the bricks in a row. If that's not as long as the goal, then we know that it's impossible.

Next, we calculate the minimum number of small bricks: goal % 5. For example, if the goal is 8 and we have 1000 large bricks, how many small bricks do we need? 8 % 5 is 3, so we need 3 small bricks at the end of the row.

If we have enough small bricks, and the total length of all the bricks is enough, then we can meet the goal.

18
ответ дан 4 December 2019 в 06:30
поделиться

он возвращает false, потому что ваша вторая проверка только сравнивает его с большими, которые в вашем примере счетчика у вас ноль.

поэтому 2 <= 0 ложно.

здесь хороший способ сделать это:

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

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

1
ответ дан 4 December 2019 в 06:30
поделиться

Во втором тесте нет необходимости. Первый проверяет, достаточно ли у вас общей длины, и все в порядке.

Но второй снова проверяет, достаточно ли у вас общей длины (return goal / 5 <= big;), но это игнорирует длину, добавленную маленькими кирпичиками. Проблема в том, что вы проверяете, кратно ли оно 5, и автоматически предполагаете, что собираетесь использовать только большие кирпичи, если это так. На самом деле вместо этого вы можете использовать пять маленьких кирпичиков. (или, как в вашем примере, 10 маленьких кирпичей.) Последняя проверка верна, проверяется, достаточно ли у вас детализации, чтобы получить нужную длину, при условии, что у вас достаточно длины.

4
ответ дан 4 December 2019 в 06:30
поделиться

Your logic is incorrect. This should do it:

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;
  }
}

is sufficient. This can be simplified to:

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;
  }
}

Of course, the sanity check on negative goal, small or big is not strictly required but recommended. Without those checks, the result can simply be obtained by:

public boolean makeBricks(int small, int big, int goal) {
  return goal <= big * 5 + small && goal % 5 <= small;
}
11
ответ дан 4 December 2019 в 06:30
поделиться

I tried some other scenarios: "makeBricks(8, 1, 13)" "makeBricks(1, 2, 6)" where either you have not enough or too many big bricks, but you need some. To account for both possibilities You would need something like:

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
ответ дан 4 December 2019 в 06:30
поделиться

вот еще одна практическая проблема, о которой я подумал, которая довольно похожа на эту проблему, просто подумал, что опубликую ее и посмотрю, сработает ли она для людей:

вам дается int SO, начинающийся репутация и репутация цели SO, которая выше, чем у стартовой репутации. Вы отвечаете на вопросы только для того, чтобы получить репутацию только на 10 или 15. вы также можете проголосовать против, чтобы вы также могли потерять репутацию на 1. что такое минимальное количество репутации, которое вы должны проиграть, чтобы достичь цели репутация?

пример: вы начинаете с 715 и хотите достичь 888. Ответ - 2.

для увеличения сложности измените целые числа на длинные и не используйте цикл.

1
ответ дан 4 December 2019 в 06:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: