今天开始弄一个新的板块,也是我在CSDN上的第一个板块,每日一题。
我之前一直都有做每日一题的想法,但是坚持几天就坚持不下去了,我也不知道这次我能坚持多久。
这个版块的文章里,除了题目,我的思路,大佬的思路这三个主要的部分之外,我还会穿插着写一些自己的心境,就当是一个树洞吧,记载着一个编程小白的心路历程。
闲话少叙,我们还是先看题。
这个题,由于是中档题,我第一次看到还是蛮害怕的,我怕我不会做。但是细细看了看之后,渐渐的有了一些思路。
大概的思路如图
啊,写到这里的时候洗脚水洒了,收拾了十几分钟宿舍,现在写博客思路有点断了。。。
先上我第一遍写的代码
class Solution {
public:
int minDeletions(string s) {
int len=s.length();
int ghost[len];
for(int i=0;i<len;i++){
ghost[i]=1;
}
char ch;
int time=0;
for(int i=0;i<len;i++)
{
if(ghost[i]==0)
continue;
ch=s[i];
for(int j=i+1;j<len;j++)
{
if(ch==s[j])
{
ghost[i]++;
ghost[j]=0;
}
}
}
for(int a=0;a<len;a++){
for(int b=a;b<len;b++){
if(ghost[a]==ghost[b]&&ghost[b]!=0){
time++;
}
}
}
return time;
}
};
为什么数组起名叫ghost,因为最近刚刚二刷COD10。。。目前还处在中二的阶段。
由于我的水平有限,暂时还没看出来哪里有问题,如果有大佬们看出来了的话,麻烦帮我指正一下,谢谢大家!
这段代码显然是没有AC的,最后的结果是103个点只过了一个点,但还好,和之前比有进步,之前有时候编译都过不了hhhh
然后看了一位大佬的题解,醍醐灌顶。我的思路还是有点麻烦,而且使用了变量作为数组的大小,这样容易逻辑上出问题(考虑的时候没注意越界这种),那么为什么我不用26个字母作为数组呢,这样不涉及变量,思考起来方便一点。
By the way, 那位大佬的Leetcode名字叫ffreturn。
除了以字母的数量作为数组长度之外这一核心思想外,题解中还用了memset函数,这里就不解释了,记住他可以用于数组初始化就好了。其实这个函数我应该是见过,但是总忘记他是干什么的,然后学校写作业的时候也不让用STL的库函数,大部分都要自己重新实现,所以有的可能在工作上很常用的函数,到我这还是很陌生,以后还是要多学多积累。
还有就是这个语法:
for (char c : s)
查了一下,发现这是C++11中新增的一种循环写法,对数组(或容器类,如vector和array)的每个元素执行相同的操作,此外string类也支持这种对字符的遍历循环操作。
如: double prices[5] = {4.99,5.99,6.99,7.99,8.99};
for(double x:prices)
cout << x << endl;
其中,x最初表示数组prices的第一个元素,显示第一个元素后,不断执行循环,而x依次表示数组的其他元素。
以上是为CSDN博主「shifouxinyu」的原创文章的一部分,原文链接:https://blog.csdn.net/shifouxinyu/article/details/70188944
还有这样的语法:
sort(cnt, cnt+26, greater<int>());
sort排序算法不多说了,主要说说greater<int>(), 这个是降序排序的意思。要使用这个的话,需要先导入头文件<functional>。
后面就很好理解了,由大到小排完,看有没有出现次数相同的字母,有的话就处理一下,处理成优秀字符串,然后返回处理了几次,大概就是这样。
第一次写博客,肯定有很多不足的地方,我现在编程水平也比较低,文中难免有写得不好的地方,欢迎大家指正,讨论。