12 часов в 24 часа - PullRequest
       1

12 часов в 24 часа

0 голосов
/ 09 февраля 2019

Я пытаюсь написать эту программу на c ++ из hackerrank, но в моем выводе все, что я получаю, это пустое место.

Строка ввода имеет вид ЧЧ : ММ : SSpp , где ЧЧ - час на двацифры с начальным нулем, MM минуты, SS секунды и pp - это либо AM, либо PM.

#include <bits/stdc++.h>
#include<iostream>
#include<string>

using namespace std;

string timeConversion(string s) 
{
    string p;
    int i,j;
    if(s[8]==80){                   // checking if it is AM or PM
       int x = s[0]*10 + s[1] +12;
       int y = x%10;
       int z = x/10;
       s[0]= z;
       s[1]= y;
       for(i=0;i<10;i++){
           p[i]=s[i];
       }
    }
    string newt= p.substr(0, p.size()-2);      //removing last two characters 
    return newt;
}

int main()
{ 
    ofstream fout(getenv("OUTPUT_PATH"));
    string s;

    getline(cin, s);                

    string result = timeConversion(s);

    fout << result << "\n";
    enter code here
    fout.close();

    return 0;
}

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

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Основная проблема

В вашей функции timeConversion() вы определяете строку p, которая инициализируется конструктором по умолчанию для строки как "".

Теперь для AM раз вы пропускаете if и переходите непосредственно к string newt= p.substr(0, p.size()-2);, что при пустой p просто создаст пустую строку newt.Таким образом, вы возвращаете пустое значение.Каждый раз !

Для PM вы заходите в if, чтобы выполнить некоторые преобразования.К сожалению p[i]=s[i]; не делает то, что вы думаете.На самом деле это не связанный доступ в пустой строке p.И, наконец, длина p все равно будет равна 0, что приведет к возвращению пустого значения (в лучшем случае).

Начало решения

Инициализация p при построении:

string p=s;

Код будет немедленно работать для строк AM.Для строк PM вам все равно нужно учитывать ответ uv_ , относящийся к ascii против двоичной математики.

Вот результат:

string timeConversion(string s) 
{
    string p=s;
    int i,j;
    if(s[8]=='P'){                   // checking if it is AM or PM
       int x =(s[0]-'0')*10 + (s[1]-'0') +12;
       p[0]= x/10 +'0';
       p[1]= x%10 +'0';
    }
    return p.substr(0, p.size()-2);   //removing last two characters 
}

Примечание: это предполагает, что формат ввода всегда будет действительным, и вместо начального 0 не будет использоваться пробел.

Важное примечание: Этот код не будет работать на хакерранке, потому что он преобразует 12:15:00 в 24:15:00, а не в 12:15:00.Кроме того, 12:00:00 утра будут преобразованы в 12:00:00 вместо 00:00:00.Больше на Википедии . Онлайн демо о том, как решать эти особые случаи

0 голосов
/ 09 февраля 2019

Проблема заключается в обработке цифр символов (например, s[0]) как целых цифр.

Если вы уверены, что имеете дело с цифрами, способ сделать арифметику с символами - вычесть значениесимвол '0', вот так: s[0] - '0'.Результатом будет целая цифра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...