刷Leetcode-539:最小时间差时遇到了个大问题:
报错如下:
terminate called after throwing an instance of 'std::length_error'
what(): basic_string::_M_create
错误代码如下:
class Solution {
public:
static bool cmp(string x,string y){ //手写排序规则 按时间升序排序
int Xshi= (x[0]-'0')*10+x[1]-'0';
int Xfen= (x[3]-'0')*10+x[4]-'0';
int Yshi= (y[0]-'0')*10+y[1]-'0';
int Yfen= (y[3]-'0')*10+y[4]-'0';
if(Xshi>Yshi || (Xshi==Yshi && Xfen> Yfen)) return false;
else return true;
}
//输入时间已排序好 x小于y 求两个时间分钟差函数
int Time_diff(string x,string y){
int Xshi= (x[0]-'0')*10+x[1]-'0';
int Xfen= (x[3]-'0')*10+x[4]-'0';
int Yshi= (y[0]-'0')*10+y[1]-'0';
int Yfen= (y[3]-'0')*10+y[4]-'0';
int diff=(Yshi-Xshi)*60;
if(Yfen>Xfen) diff+=Yfen-Xfen;
else diff-=Xfen-Yfen;
return diff;
}
int findMinDifference(vector<string>& timePoints) {
//排序后相邻两个之间进行对比 另外第一个和最后一个也要对比
sort(timePoints.begin(),timePoints.end(),cmp);
//第一个和最后一个对比
int T_min=min( Time_diff(timePoints[0],timePoints[timePoints.size()-1]),
1440-(Time_diff(timePoints[0],timePoints[timePoints.size()-1])) );
//相邻两个进行对比
for(int i=1;i<timePoints.size();i++)
{
T_min=min(T_min, Time_diff(timePoints[i-1],timePoints[i]) );
}
return T_min;
}
};
来回看代码,愣是看不出任何问题,查阅了几百个相关网页,基本都是说以下两个原因:
- 输入了空字符串
- 数组下标越界
然而我的代码里明显并没有这两个问题。最后查了一晚上,找到了官方对于sort排序比较的说明。
https://en.cppreference.com/w/cpp/named_req/Compare
我们重点看这里:
也就是说,对于我们手写的这个cmp比较函数,要满足以下三点:
- 对于所有的输入a,输入两个相同的元素,即cmp(a,a),返回的结果要是false,不能是false。
- 如果输入cmp(a,b)的结果为true,反过来输入cmp(b,a)的结果要是false,也就是如果a>b,不能再出现b>a,否则就发生矛盾了。
- 如果输入的 cmp(a,b)的结果为ture,以及输入 cmp(b,c)的结果为true,那么cmp(a,c)的结果也要为true,这个也很好理解,如果a>b且b>c那么a必然要大于c。
这里主要就是要注意第一点,当输入的两个数相同时,返回的结果要为false,而我的代码:
static bool cmp(string x,string y){ //手写排序规则 按时间升序排序
int Xshi= (x[0]-'0')*10+x[1]-'0';
int Xfen= (x[3]-'0')*10+x[4]-'0';
int Yshi= (y[0]-'0')*10+y[1]-'0';
int Yfen= (y[3]-'0')*10+y[4]-'0';
if(Xshi>Yshi || (Xshi==Yshi && Xfen> Yfen)) return false;
else return true;
}
不满足这个规则。因此加上个 = 号,使其符合规则即可。
static bool cmp(string x,string y){ //手写排序规则 按时间升序排序
int Xshi= (x[0]-'0')*10+x[1]-'0';
int Xfen= (x[3]-'0')*10+x[4]-'0';
int Yshi= (y[0]-'0')*10+y[1]-'0';
int Yfen= (y[3]-'0')*10+y[4]-'0';
if(Xshi>Yshi || (Xshi==Yshi && Xfen>= Yfen)) return false;
else return true;
}
困扰了我整整一晚上的问题得以解决。