HJ10 字符个数统计
编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),
换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。 a,a,a输出1
方法一:不细讲
#include<stdio.h>
#include<string.h>
int redo(char* arr)
{
int n = strlen(arr);
int i = 0, j = 0;
for (i = 0; i < n; i++)
{
for (j = i + 1; j < n; j++)
{
if (arr[i] == arr[j])
{
int k = 0;
for (k = j; k < n-1; k++)
{
arr[k] = arr[k + 1];
}
n--;
j--;
}
}
}
return n;
}
int main()
{
char arr[550] = { 0 };
gets(arr);
int n = redo(arr);
printf("%d", n);
return 0;
}
方法二:(在网上看到的,觉得写的好好)
不同的字符有不同的ASCIl码值,我们将字符对应的ASCII码值(整形数据)作为数组的下标来存放字符
遇到相同的字符无变化(还是存储在数组相同的ASCII值作为下标的位置上),遇到不同的字符就存放在不同的位置(ASCII值不同,下标也就不同)
* HJ10 字符个数统计
* 编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),
换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。 a,a,a输出1
*/
/*
* 思路:不同的字符有不同的ASCII码值,我们将字符对应的ASCII码值(整形数据)作为数组的下标来存放字符
* 遇到相同的字符无变化(还是存储在数组相同的ASCII值作为下标的位置上),遇到不同的字符就存放在不同的位置(ASCII值不同,下标也就不同)
*/
#include<stdio.h>
#define size 128 //因为ASCII码范围在0~127,有128个
int main()
{
char chars = 0;
char arr[128] = { -1 }; //因为ASCII码值没有-1,只有0~127
int sign = 0;
while (scanf("%c", &chars)!=EOF)
{
if (chars == '\n')
{
break;
}
else
{ //arr[(int)chars]的意思是将字符变量chars存放的字符强制类转换成整形数据作为数组下标
if (arr[(int)chars] != chars) //字符不相同的话
{
arr[(int)chars] = chars; //将字符对应的ASCII码值(整形数据)作为数组的下标来存放字符
sign++;
}
}
}
printf("%d", sign);
return 0;
}