目录
一、6208.有效时间的数目(简单题) (c语言暴力解法)
二、6204.于对应负数同时存在的最大正整数(简单题)(c语言求解)
三、6205.反转之后不同正数的数目(中等题)(c语言求解)
总结
89场双周赛第一题:
int countTime(char * time){
char h[2]={0};
int i=0;
int count=1;
while(*time!=':')
{
h[i]=*time;
i++;
time++;
}
time++;
if(h[0]=='?'&&h[1]=='?')
{
count=24;
}
if(h[0]=='?'&&h[1]!='?'&&(h[1]<'4'))
{
count=3;
}
if(h[0]=='?'&&h[1]!='?'&&(h[1]>='4'))
{
count=2;
}
if(h[1]=='?'&&h[0]!='?'&&h[0]<'2')
{
count=10;
}
if(h[1]=='?'&&h[0]!='?'&&h[0]=='2')
{
count=4;
}
char m[2]={0};
int j=0;
int x=1;
while(*time!='\0')
{
m[j]=*time;
j++;
time++;
}
if(m[0]=='?'&&m[1]=='?')
{
x=60;
}
if(m[0]=='?'&&m[1]!='?'&&m[1]==0)
{
x=7;
}
if(m[0]=='?'&&m[1]!='?'&&m[1]!=0)
{
x=6;
}
if(m[0]!='?'&&m[1]=='?')
{
x=10;
}
return x*count;
}
1、分析题意:给出一个time,为hh:mm的格式,字符串time中有个位置会被?替代,让我们求出被问号替代后这个位置有几种符合时间规定的可能。例如:"?5:00",小时的第一个位置被替代,第二个位置固定为5,所以我们只有两种可能,05:00或15:00,因为如果25:00的话超过规定时间的24:00了,不符合题意,所以这个?只能替代0和1,所以我们会输出2.
以下思路以"?5:00"给出:count为小时的计数器,x为分钟的计数器,以下比较均加上''用字符,因为题中传入的是字符,否则会通不过测试用例。
2、代码思路:
(1)题目中给了我们一个char*的指针time,小时和分钟的位置也就最多两个数,所以我创建了一个h[2]的数组,通过while循环,让time指针后移的同时把time的前两个值(小时)赋给我的h数组,这样h[0]='?',h[1]=5,循环结束后切记还要让time指针++跳过这个(':')符号。
(2)我们进行第一个判断,如果h数组第一个存?第二个也是?,我们就有24个小时,count=24;第二个判断,如果第一个是?第二个不是?且第二个数比4小,我们就有三种选择,因为只有24个小时,第二个数小于4,我们就可以选0、1、2三种,count=3;第三个判断和第二个相反,如果第二个数比4大,我们就只有0、1两种选择,count=2。第四个判断第一个不是?,第二个是?且第一个<2,因为第一个如果小于2,后面就可以取0-9任何数,所以有十种选择,count=10;第五个判断是第一个不是?,第二个是?且第一个刚好是2,这样我们就只能区0-3四个选择了,count=4。
(3)我们同上创建一个m[2]数组,存放分钟时间,一样的while循环存放time指针后移取数。
(4)我们第一个判断第一个数是?且第二个数也是?,这样我们就有60中选择,x=60;第二个判断第一个是?第二个不是?且第二个数是0,这样我们就只有0-6七个选择,x=7;第三个判断第一个是?第二个不是?且第二个不是0,只有我们第一个就只能取0-5六个选择,x=6;第四个判断第一个不是?第二个是?,我们可以取0-9十种选择,x=10。
(5)最后返回x*count;
3、总结:这是算法小白入门打的第一道力扣比赛题目,刚开始感觉题都读不懂,但是后来循序渐进,可以慢慢上手暴力求解,然后通过测试用例逐一排查,排查了5次好像就把所有结果考虑上了,我的求解没有任何算法成分,慢慢的感情,写了40分钟写出来,感觉也不遗憾这次周赛了,给自己开了个好头!
力扣315场周赛第一题:
int findMaxK(int* nums, int numsSize){
int count=0;
int max=-1;
for(int i=0;i
1、分析题意:题目中给了非0整数数组nums,需要找出于自身相反的最大整数,就是在数组中需要存在一个数的正数和负数,且要找出这个正数是存在正数负数中最大的数,例如nums[]={-1,1,2,3,4,-3},这里1和3都满足存在正负数的条件,但3更大,所有输出3;
2、代码思路:定义一个计数器count从0开始,定义一个max找寻最大的正整数,两个for循环去一一寻找,我们需要判断条件,nums[i]==-nums[j],同时存在正负数才满足,满足这个条件的数进入if中我们就判断他是否比max大,这样循环到最后就能找到最大的正数,最后我们输出这个最大的正数就解决了。
力扣315场周赛第二题:
int reserve(int x)
{
long long a=0;
while(x>0)
{
a=x%10+a*10;
x/=10;
}
return a;
}
int countDistinctIntegers(int* nums, int numsSize){
long long a[1000001]={0};
long long b[1000001]={0};
long long max=-1;
long long count=0;
for(int i=0;i=1)
{count++;}
}
return count;
}
1、分析题意:题目给我们一个数组nums,我们需要将他里面的数都反转后,加在数组的末尾,形成二倍大的数组,然后从中寻找不一样的数(相同的数只算一次),统计个数输出。例如nums={1,13,10,12,31},反转后得到1,31,1,21,13,其中就有1、13、10、12、21、31六个数,就输出6.
2、代码分析:
(1)我们先定义一个反转函数reserve,数据用longlong类型,while判断是否大于0,a=x%10+a*10,就可以实现反转,最后循环结束输出a,就实现了数的反转。
(2)定义两个大数组a和b,a存放每个数的出现次数,b存放反转前后的数,max寻找最大值,好实现循环找a中的数,计数器count=0;第一个循环把nums中的数存入b中,第二个循环从numsSize开始,到2*numsSize结束,把nums反转后的数存在数组反转前的数后面,第三个循环遍历数组,找到b中的数在a中的位置++,例如b中的数是2,则a中下标为2的位置++,同时寻找b中最大的数,为遍历a数组铺垫;第四个循环遍历a数组,用count记录a数组中出现过一次及以上的数;这样我们就可以准确找到那个数了。
这次周赛一共八题,做出了三题,对算法刚刚入门的我有了很大的鼓励,我准备学习Java语言,以后用Java打算法了,去学更多的算法,用更好的代码水平打比赛,更能给大家介绍更好的题解,而不是一味的暴力求解。加油!!!