c语言打力扣第89场双周赛第一题和315场周赛第一、二题(c语言)

目录

一、6208.有效时间的数目(简单题) (c语言暴力解法)

二、6204.于对应负数同时存在的最大正整数(简单题)(c语言求解)

三、6205.反转之后不同正数的数目(中等题)(c语言求解)

总结


一、6208.有效时间的数目(简单题) (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分钟写出来,感觉也不遗憾这次周赛了,给自己开了个好头!


二、6204.于对应负数同时存在的最大正整数(简单题)(c语言求解)

力扣315场周赛第一题:



int findMaxK(int* nums, int numsSize){
    int count=0;
    int max=-1;
    for(int i=0;i<numsSize;i++)
    {
        for(int j=0;j<numsSize;j++)
        {
            if(nums[i]==-nums[j])
            {
                if(max<nums[i])
                max=nums[i];
            }
        }
    }
    return max;
}

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大,这样循环到最后就能找到最大的正数,最后我们输出这个最大的正数就解决了。


三、6205.反转之后不同正数的数目(中等题)(c语言求解)

力扣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<numsSize;i++)
    {
        b[i]=nums[i];
    }
    for(int i=numsSize;i<numsSize*2;i++)
    {
        b[i]=reserve(nums[i-numsSize]);
    }
    for(int i=0;i<numsSize*2;i++)
    {
            a[b[i]]++;
            if(max<b[i])
            {max=b[i];}
    }
    for(int i=0;i<=max;i++)
    {
        if(a[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打算法了,去学更多的算法,用更好的代码水平打比赛,更能给大家介绍更好的题解,而不是一味的暴力求解。加油!!!

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 34
    评论
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员X.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值