'12 hour to 24 hour time conversion

I am trying to write this c++ program from hackerrank but in my output all I am getting is a blank space.

The input string is in the form of HH:MM:SSpp where HH is an hour on two digits with leading zero, MM the minutes, SS the seconds and pp is either AM or 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;
}

Is there some logical error? I know the other approach for this question but it would be great if anyone could help me with it.



Solution 1:[1]

The problem is with treating character digits (e.g. s[0]) as integer digits.

If you are certain you are dealing with digits, the way to do arithmetic with the characters is by subtracting the value of the character '0', like so: s[0] - '0'. The result will be the integral digit.

Solution 2:[2]

The main problem

In your timeConversion() function, you define a string p, which is initialized by the string default constructor to "".

Now for AM times, you skip the if and go directly to string newt= p.substr(0, p.size()-2);, which on an empty p will just create an empty newt string. So you return an empty value. Every time !

For PM times, you go into the if to do some transformations. Unfortunately p[i]=s[i]; doesn't do what you think. In fact it is out of bound access in the empty p string. And in the end, the length of p will still be 0 which will cause an empty value to be returned (in the best case).

The start of a solution

Initialize p at construction:

string p=s;

The code will then immediately work for AM strings. For PM strings, you still need to take into account uv_ 's answer related to ascii vs. binary math.

Here the result:

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 
}

Note: this assumes that the entry format will always be valid, and no space will be used instead of a leading 0.

Important Note: This code will fail on hackerrank, because it transforms 12:15:00pm into 24:15:00 and not in 12:15:00. Furthermore 12:00:00am will be tranformed in 12:00:00 instead of 00:00:00. More on wikipedia. Online demo about how to address these special cases

Solution 3:[3]

This code will work considering all test cases, just added two more conditions.

string timeConversion(string s)
{
       string ans=s;
       if(ans[8]=='P')
       {
           int x = (ans[0]-'0')*10+(ans[1]-'0')+12;
           //cout<<x;
           if(x!=24)
           {
                ans[0]=x/10+'0';
                ans[1]=x%10+'0';
           }
       }
       if(ans[8]=='A')
       {
           int y=(ans[0]-'0')*10+ans[1]-'0';
           if(y==12)
           {
               ans[0]='0';
               ans[1]='0';
           }
       }
    return ans.substr(0, ans.size()-2);
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 uv_
Solution 2
Solution 3 Manish Kumar Jha