题目
字符个数统计
题目要求
链接: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;
}