本来打算干一天活的,但感觉不知为何有点懒散了。
上午11多才起的床,文章没来得及看,就稍微找了下,确定了一下要看的选题。
下午就搁着写作业了,《最优化方法》的作业,第四章,无约束的最优化,抛开证明题不说,这计算前面还好,只要带入公式计算就好了,后面这答题这计算量不对吧,感觉好大,算出来全是分数,不知道是不是算错,也是算了几遍,还要迭代,到后面在看看吧,不行要上课听老师讲一遍了。
然后上床躺着了。
下午接着刷题:
1道简单,2道中等。
696. 计数二进制子串
给定一个字符串 s,统计并返回具有相同数量 0 和 1 的非空(连续)子字符串的数量,并且这些子字符串中的所有 0 和所有 1 都是成组连续的。
int n=s.size();
//题解的思路,统计连续的个数,相等+1
vector<int> count;
int i=0;
while(i<n)
{
int c=0;
char ch=s[i];
while(s[i]==ch&&i<n)
{
c++;
i++;
}
count.push_back(c);
}
int m=count.size();
int ans=0;
for(int i=0;i<m-1;i++)
{
ans=ans+min(count[i],count[i+1]);
}
return ans;
一个是统计相同数字长度的count数组,然后在count数组中,寻找01相同的子串,找最短的那一个,同时如果是000111的话,又包含0011,01这样子的,所以直接+3即可
感觉这些字符串的题目都比较的取巧,或者说是考验思路了。
但是这个简单题目真的并不简单,纯正的考验思路和理解。
539. 最小时间差
给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
vector<int> minute;
for(int i=0;i<n;i++)
{
int t=time[i][0]*60+time[i][1];
minute.push_back(t);
}
sort(minute.begin(),minute.end());
vector<int> dif;
if(minute[0]==0)
{
minute.push_back(1440);
}
for(int i=0;i<minute.size()-1;i++)
{
int m_t=minute[i+1]-minute[i];
dif.push_back(m_t);
}
int min_t=1440;
for(int i=0;i<dif.size();i++)
{
if(dif[i]<min_t)
{
min_t=dif[i];
}
}
int last=minute.size();
if(minute[0]!=0)
{
int two_day=minute[0]+1440-minute[last-1];//隔两天的时间差
min_t=min(min_t,two_day);
}
return min_t;
}
就是把全部的时间转化成分钟数表示,前面的操作处理就不放了。
就是看一下要快一点搞还是要排序,然后还要处理00:00的时间,然后还要记得处理隔两天的也可以时间短也就是最早的时间+1440和最晚的时间的差
然后又去看了会mizuki的内容,稍微又改了些内容,方便后面接着改进。
本来打算早点搞完的,但是感觉看着挺多的,还是慢慢改吧。
晚上本来想要么继续改改,要么看数据库的,但是出去吃饭了,晚上也有约了,那算了吧。
不是很满,但是至少也是干了不少活的。