Java - от 12 часов до 24 часов (хакерранк) - PullRequest
0 голосов
/ 26 мая 2018

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

Мой вопрос

Я былпытаясь решить некоторые проблемы с хакерранком в Java 7, я столкнулся с проблемой преобразования времени, где формулировка проблемы:

Проблема: "Учитывая время в -час AM /Формат PM, конвертируйте его в военное (24-часовое) время. "

Образец ввода 07:05:45 PM

Образец вывода 19: 05: 45

Я смотрел на решения, включающие библиотеки (такие как java.text.SimpleDateFormat, Calendar и т. Д.), Но я пытаюсь сделать это самостоятельно без них.Проблема, с которой я здесь сталкиваюсь, заключается в том, что мое решение терпит неудачу в некоторых тестовых случаях, но работает в других.Короче говоря, это не правильное решение.Я вижу другие решения, но я хочу знать, почему мое не дает правильного ответа.Не могли бы вы помочь мне, объяснив, где это может произойти, и как я могу исправить это?

Вот некоторые из решений, на которые я обратил внимание:

Преобразование за 12 часоввремя до 24 часов время в Ява

Конвертировать 12 часов в 24 часа

Мой код здесь:

import java.io.*;
import java.math.*;
import java.text.*;
import java.util.*;
import java.util.regex.*;

public class Solution {

    static String timeConversion(String s) {

        //get the string into an array using : as a separator
        String[] time_array = s.split(":");

        //military_time variable to be returned
        String military_time = new String();

        //final HH part
        String hh_final = new String();
        //Rest after HH to be concatenated to get military_time
        String rest = new String();


        StringBuilder REST_mil_builder = new StringBuilder();
        for (int i = 2; i < 8; i++) {
            REST_mil_builder.append(s.charAt(i));
        }
        //"rest" basically gets everything after HH excluding AM/PM, so 01:03:40PM would have a "rest" value of ":03:40"
        rest = REST_mil_builder.toString();

        int hh = Integer.parseInt(time_array[0]);
        String AMPM_contains = time_array[2];

        //converting if the last piece after the split contains "PM"
        if (AMPM_contains.contains("PM")) {
            hh = hh + 12;
            hh = hh == 24 ? 0 : hh;
        }

        //converting hh to have a 0 before it because when it is an integer 01 will be just 1 which we don't want
        StringBuilder hh_build = new StringBuilder();
        if (hh >= 0 && hh <= 9) {
            hh_build.append("0");
            hh_build.append(hh);
            hh_final = hh_build.toString();
        } else {
            hh_build.append(hh);
            hh_final = hh_build.toString();
        }

        //military time concatenation
        military_time = hh_final + rest;
        //Midnight is 12:00:00AM on a 12-hour clock, and 00:00:00 on a 24-hour clock
        military_time = s == "12:00:00AM" ? "00:00:00" : military_time;
        //Noon is 12:00:00PM on a 12-hour clock, and 12:00:00 on a 24-hour clock.
        military_time = s == "12:00:00PM" ? "12:00:00" : military_time;

        return military_time;

    }

    private static final Scanner scan = new Scanner(System.in);

    public static void main(String[] args)  {

        //tried several 12 hour time formats here
        String result = timeConversion("01:30:59PM");
        System.out.println(result);
    }
}

Ответы [ 4 ]

0 голосов
/ 26 мая 2018

Ваш код не работает, потому что он неправильно обрабатывает 12-й час, т. Е. 12:xx:xxAM должен отображаться на 00:xx:xx, а 12:xx:xxPM должен отображаться на 12:xx:xx, как указано в ответе Оле VV

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

Анализ первых двух цифр в числе.Если число равно 12, установите его на 0. Трюковый способ сделать это - использовать модуль 12. Если ввод заканчивается на PM, добавьте 12. Теперь перестройте строку, заменив первые 2 цифры новым номером и удалив AM /Суффикс PM.

Пример:

public static String timeConversion(String s) {
    int hour = Integer.parseInt(s.substring(0, 2)) % 12;
    if (s.endsWith("PM"))
        hour += 12;
    return String.format("%02d", hour) + s.substring(2, 8);
}

Использование тестов Ole VV

System.out.println(timeConversion("12:30:59AM"));
System.out.println(timeConversion("11:30:59AM"));
System.out.println(timeConversion("12:30:59PM"));
System.out.println(timeConversion("11:30:59PM"));

Вывод

00:30:59
11:30:59
12:30:59
23:30:59
0 голосов
/ 26 мая 2018

Использовать SimpleDateFormat:

public static String to24Time(String str) throws ParseException {
    DateFormat df12 = new SimpleDateFormat("hh:mm:ssa", Locale.US);
    DateFormat df24 = new SimpleDateFormat("HH:mm:ss", Locale.US);
    return df24.format(df12.parse(str));
}

PS Это задание от Hackerrank: Алгоритмы / Прогрев / Преобразование времени .

  1. Нет замечаний, что запрещено использовать внутренние классы java для разбора времени, и вы должны делать это вручную.
  2. При условии, что ответ дает 100% теста для этой задачи.

PPS Если вы не хотите использовать SimpleDateTime, это пример использования Регулярное выражение .Обратите внимание, что я не предоставляю полную проверку ввода ввода;в некоторых случаях (например, для недопустимого 12-часового формата времени, такого как 21:17:17 PM), он возвращает результат незаконного вместо исключения:

public static String to24Time(String str) throws ParseException {
    final Pattern TIME_12 = Pattern.compile("(?<hour>\\d{2}):(?<minute>\\d{2}):(?<second>\\d{2})(?<part>am|pm)");
    Matcher matcher = TIME_12.matcher(str.toLowerCase());

    if (matcher.matches()) {
        int hour = Integer.parseInt(matcher.group("hour"));
        return ("pm".equals(matcher.group("part")) ? hour + 12 : hour) + ":" + matcher.group("minute") + ':' + matcher.group("second");
    }

    return null;
}
0 голосов
/ 26 мая 2018
    System.out.println(timeConversion("12:30:59AM"));
    System.out.println(timeConversion("11:30:59AM"));
    System.out.println(timeConversion("12:30:59PM"));
    System.out.println(timeConversion("11:30:59PM"));

Ожидаемый вывод:

00:30:59
11:30:59
12:30:59
23:30:59

Наблюдаемый вывод:

12:30:59 (wrong)
11:30:59 (correct)
00:30:59 (wrong)
23:30:59 (correct)

Редактировать: Короче говоря, кажется, ваш код не учитываетэтот 12-й час отличается от 12-часовых.Вы можете сказать, что он используется как час 00. Я не думаю, что будет слишком сложно исправить вашу программу, поэтому я позволю вам насладиться первым кадром.Если вам нужна подсказка, просим следить за комментариями.Мы все рады помочь.

Кроме того, вы используете new String() в трех местах своего кода.Я думаю, что это излишне, потому что вы никогда не используете созданные пустые строки для чего-либо.

0 голосов
/ 26 мая 2018

Пожалуйста, попробуйте это static String timeConversion(String s) function. Я надеюсь, что это поможет вам.

static String timeConversion(String s) {

        String[] time = s.split(":");

        String hours = time[0];
        String minutes = time[1];
        String seconds = time[2].substring(0, 2);
        String dayEve = time[2].substring(2, 4);
        if (dayEve.equals("AM")) {
            return ((hours.equals("12") ? "00" : hours) + ":" + minutes + ":" + seconds);
        } else {
            return ((hours.equals("12") ? hours : (Integer.parseInt(hours) + 12)) + ":" + minutes + ":" + seconds);
        }

    }

Основная логика: -

Если 'AM' и hours == 12, то часы установлены на00 иначе не меняются hours.

Если 'PM' и hours == 12, то не меняются hours иначе часы установлены на hours = hours+12.

...