8
13:00:00 - 18:00:00
00:00:00 - 01:00:05
08:00:00 - 09:00:00
07:10:59 - 08:00:00
01:00:05 - 04:30:00
06:30:00 - 07:10:58
05:30:00 - 06:30:00
18:00:00 - 19:00:00
被下面的报错折磨了一个半小时:
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::substr: __pos (which is 11) > this->size() (which is 0)
基本题意就是输出没有包含的时间段,因为题目保证了给定的两个时间段之间最多只有一个交点,也就是没有区间重合的情形,所以思路就很简单,直接按照字符串的格式读进来排序遍历一遍就好。
C++读取一行可以用getline(cin,tmp),第三个参数默认为换行,也可以自行设定以什么为间隔,其中tmp是string类型的变量,getline()需要#include< string >;
还可以用cin.getline(char *, int size), 定义一定大小的字符数组传入,读入size大小的长度,size中包含’\0’,如果一行中输入的长度大于size,后面的会丢掉,所以就记住用它必须保证读完一行,第三个参数默认为换行,也可以自行设定以什么为间隔。一般情况下size和字符数组的大小一样就好了。
但是要注意getline或者cin.getline()前面如果有cin或者scanf,一定要先getchar()吸收一下换行!!!
,最离谱的是,没有getchar(),下面的代码还能排序,排好序之后还能for循环输出,但是一旦获取某个特定的元素,即str[i]就会是空,str[i].size()为0,原来是因为读入失败的问题…
当然其实遇到困难不要总是尝试一种方法,既然无法读取一行,以空格分隔读进来也是可以处理的,一种方法行不通就换方法吧,不要执念于一种方法。
ps:同样能AC的代码,用java只能17/25,最后两个点超内存,还是少用java
写算法题吧。。。
#include
using namespace std;
vector<string> str;
int main(){
int N;
cin >> N;
getchar();
for(int i=0;i<N;i++){
string tmp;
getline(cin,tmp);
str.push_back(tmp);
}
str.push_back("00:00:00 - 00:00:00");
str.push_back("23:59:59 - 23:59:59");
sort(str.begin(),str.end());
for(int i=0;i<str.size()-1;i++){
if(str[i].substr(11,8)==str[i+1].substr(0,8)){
continue;
}else{
cout << str[i].substr(11,8) << " - " << str[i+1].substr(0,8) << endl;
}
}
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)