Я столкнулся с этим вопросом в одном из заданий интервью.Показать максимальное военное время с заданных четырех целых чисел
Вопрос состоял в том, что с учетом четырех целых чисел отображалось максимально возможное время в 24-часовом формате ЧЧ: ММ. Например, если вы даете A = 1, B = 9, C = 9, D = 2, то вывод должен быть 19:29. Максимальное время может быть 23:59, а минутное время - 00:00. Если невозможно построить 24-часовое время, возвращайте ошибку. Например, при A = 1, B = 9, C = 7, D = 9 ошибка должна быть возвращена, поскольку минимальное время, представляемое этими целыми числами, равно 17:99, что является недопустимым.
Мой первоначальный подход состоял в том, чтобы найти все 24 целочисленных перестановки заданного числа, а затем устранить все из них, которые больше 2400. После этого устранить все целые числа, которые имеют более 59 в последних двух цифрах. То есть, 5 в десяти местах и 9 на месте. После этой фильтрации верните самое высокое целое число слева в нашем результирующем наборе.
Этот подход возможен здесь, так как мы должны просто вычислить 24 перестановки и даже меньше комбинаций, поскольку дубликаты будут удалены. Но я считаю, что это подход грубой силы. Есть ли какая-нибудь другая идея, которая не требует от нас создания всех перестановок?
Также как расширение этой проблемы, в случае, если нас попросят продлить время на секунды или миллисекунды, учитывая в общей сложности 6 цифр или 8 цифр соответственно, мой подход будет дорогостоящим. Предположим, что максимально допустимая сложность времени выполнения может быть O (nlogn) и, таким образом, позволяет сортировать. Кроме того, как проверить случаи краев, о которых я упоминал выше?
Спасибо.
EDIT: Ниже приведен код ответа, предложенный в комментариях.
//Input arraylist contains the four integers
public static String maxTime(ArrayList<Integer> list){
int first = -1;
int second = -1;
int third = -1;
int fourth = -1;
for (int a : list) {
if (a <= 2 && a > first) {
first = a;
}
}
list.remove(Integer.valueOf(first));
for (int a : list) {
if (first == 2 && a <= 3 && a > second) {
second = a;
}
}
if (second == -1) {
for (int a : list) {
if (a > second) {
second = a;
}
}
}
list.remove(Integer.valueOf(second));
for (int a : list) {
if (a <= 5 && a > third) {
third = a;
}
}
list.remove(Integer.valueOf(third));
fourth = list.get(0);
StringBuilder sb = new StringBuilder(5);
sb.append(first);
sb.append(second);
sb.append(':');
sb.append(third);
sb.append(fourth);
return sb.toString();
}
Я уже прошел через эту ссылку вопроса, но это не имеет какое-либо удовлетворительные ответы. Пожалуйста, взгляните на это. –
Связанный вопрос имеет хороший ответ. Я посмотрел на него. Просто реализуйте это. Если у вас есть проблемы с этим, отправьте свой код и задайте конкретный вопрос о том, в чем проблема. – trincot
Выполнено. Все еще не дает желаемого результата. По-видимому, крайний случай проверки достоверности ввода, который я упомянул в моем вопросе, был неправильным. Поэтому даже краткий случай в указанном ответе отсутствует. Обновите мой вопрос кодом. –