字符个数统计

题目

字符个数统计

题目要求

链接:https://www.nowcoder.com/questionTerminal/eb94f6a5b2ba49c6ac72d40b5ce95f50
来源:牛客网

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

示例

示例1
输入
abc
输出
3

示例2
输入
aaa
输出
1

解答

方法一、

实现思路

创建一个大小为128的字符数组,并且初始化全为0,用来记录字符是否出现过。然后将输入的字符的ASCII码值转为int型作为该字符在数组中的下标,并且将数组中该下标对应的值设为1,字符的个数加1,如果再次遍历到该字符时,查找到该字符的ASCII码值对应下标在数组中的值为1,就不会让字符的个数加1。

时间复杂度和空间复杂度

时间复杂度:O(n)
空间复杂度:O(1)

代码

#include <stdbool.h>
#include <stdio.h>
#include <string.h>

int main() {
    char c = 0;
    char str[128] = {0};  //辅助数组,用来存字符c是否出现过
    int a = 0;
    int count = 0;
    while(scanf("%c",&c)!=EOF) //输入
    {
        a = (int)c;  //将字符c的ASCII码转为int型
        if(str[a]==0&&a!=10) //将c的ASCII作为下标,然后判断该下标的值为0,就说明字符c没有出现过
        {
            str[a]=1;   //将该下标的值置为1,说明该字符出现过
            count++; //字符种类加1
        }
    }
    printf("%d\n",count);
    return 0;
}

方法二、

暴力破解

实现思路

创建两个数组,一个用来存储输入的字符串,另一个用来存储每个已经出现的字符,先遍历输入的字符串,然后在遍历到每一个字符时,都遍历辅助数组,来查看该字符在辅助数组中是否已经出现,如果没有出现就将该字符加入到辅助数组中,最后辅助数组的长度就为字符种类个数。

时间复杂度和空间复杂度

时间复杂度:O(nlogn)
空间复杂度O(n)

代码

#include <stdbool.h>
#include <stdio.h>
#include <string.h>
 
int main() {
    char str[505] ={0};
    char res[127] = {0};  //创建一个辅助数组,将每个出现的字符都放在里面
    scanf("%s",str);
    int i = 0;
    int len = strlen(str);
    int count = 0;
    int j = 0;
 
    //暴力破解
    for(i=0;i<len;i++)  //遍历数组
    {
        if(str[i]<=127&&str[i]>0)  //如果字符ASCII在0-127就进去
        {
            int flag = 1;
            for(j=0;j<count;j++)  //遍历辅助数组
            {
                if(str[i]==res[j])  //如果该字符在辅助数组中已经有,就不加入
                {
                    flag=0;
                    break;
                }
            }
            if(flag)  //如果该字符没有,就加入辅助数组
            {
                res[count]=str[i];
                count++;
            }
        }
    }
    printf("%d",count);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值