C语言-----每日三题(提高你的编程能力)

本文介绍了三个字符串处理和数组统计的问题,包括计算字符串最后一个单词的长度、统计字符串中不同字符的数量以及找出数组中的多数元素。解题思路涉及字符串遍历、快速排序和计数统计。代码示例分别给出了C语言的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串最后一个单词的长度

计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)

题目链接—https://www.nowcoder.com/practice/8c949ea5f36f422594b306a2300315da?tpId=37&&tqId=21224

解题思路:从数组的最后一个字符开始统计遇到空格停止即可,但是有一个要注意的点,就是输入字符串的时候
scanf遇到空格就停止了。 所以这里我们要读取一行-------scanf("%[^\n]",arr);
看代码

#include<stdio.h>
#include<string.h>
int main()
{
    char arr[5000]={0};
    scanf("%[^\n]",arr);
    char* ret=arr+strlen(arr)-1;
    int count=0;
    while(*ret!=' ' && ret >= arr)
    {
       count++;
       ret--;
    }
     printf("%d\n",count);
     return 0;
}

字符个数统计

编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。

题目链接------https://www.nowcoder.com/practice/eb94f6a5b2ba49c6ac72d40b5ce95f50?tpId=37&&tqId=21233&rp=1&ru=/ta/huawei&qru=/ta/huawei/question-ranking

解题思路:
1先使用快排,这样相同的元素就集中在一起了
2然后开始遍历这个数组,两个元素不同就+1,这样加完以后,再加1就是数组元素的种类了

看代码

#include<stdio.h>
#include<string.h>
int cmp_char(const void* e1,const void* e2)
{ 
    return *(char*)e1-*(char*)e2;
}

int main()
{
    char arr[500]={0};
    scanf("%s",arr);
    int len=strlen(arr);
    qsort(arr,len,1,cmp_char);
    int i=0,count=0;
    for(i=0;i<len-1;i++)
    {
     if(arr[i]!=arr[i+1])
         count++;
    }
    printf("%d\n",count+1);
    return 0;
}

多数元素

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/majority-element

解题思路:
1.先用qsort快速排序一下数组,相同的元素就在一块了
2.然后用i,j两个下标为0开始统计,相同则j++,并开始统计
3不等然后j赋值给i,再重新统计
4比较重要的一点,题目说了一定存在,所以我们尽量在统计的时候+1就与n/2比较一下,
如果统计完了再比较,会出现一些不可预料的错误。

先看正确可通过的代码


int cmp_int(const void* e1,const void* e2)
{
    return *(int*)e1-*(int*)e2;
}

int majorityElement(int* nums, int numsSize)
{
    qsort(nums,numsSize,sizeof(int),cmp_int);
   int i=0,j=0,count=0;
   while(i<numsSize && j<numsSize)
   {
     int count =0;
     while(nums[i]==nums[j] )
     {
         count++;
         if(count>numsSize/2)
           goto test;
         j++;
     }
       i=j;
   }
   test:
      return nums[i];
}

如果你统计完再比较,就会出现错误
例如这个不通过的代码


int cmp_int(const void* e1,const void* e2)
{
    return *(int*)e1-*(int*)e2;
}

int majorityElement(int* nums, int numsSize)
{
    qsort(nums,numsSize,sizeof(int),cmp_int);
   int i=0,j=0,count=0;
   while(i<numsSize && j<numsSize)
   {
     int count =0;
     while(nums[i]==nums[j]&&j<numsSize) //这里避免了数组越界,但仍旧不通过
     {
         count++;
         j++;
     }
      if(count>numsSize/2)
           goto test;
       i=j;
   }
   test:
      return nums[i];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

通过全部用例

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

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

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

打赏作者

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

抵扣说明:

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

余额充值