我正在尝试从hackerrank编写此c ++程序,但是在输出中,我得到的只是一个空白。
输入字符串采用 HH : MM : SSpp 的形式,其中 HH 是一个小时两位数字,前导零, 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;
}
是否存在一些逻辑错误?我知道解决该问题的另一种方法,但是如果有人可以帮助我,那将是很好的。
答案 0 :(得分:0)
问题在于将字符数字(例如s[0]
)视为整数数字。
如果确定要处理数字,则对字符进行算术的方法是减去字符'0'
的值,就像这样:s[0] - '0'
。结果将是整数。
答案 1 :(得分:0)
在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字符串,您仍然需要考虑与ascii与二进制数学有关的uv_ 's answer。
结果在这里:
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。 < / p>
重要说明: 该代码在hackerrank上将失败,因为它将12:15:00 pm转换为24:15:00而不是12:15 :00。此外,上午12:00:00将在12:00:00而不是00:00:00转换。有关wikipedia的更多信息。 Online demo关于如何解决这些特殊情况