什么是字符串?
字符串是一系列字符所组成的序列,字符包括字母、数字、特殊符号等等。在C程序中,我们可以用字符数组来表示字符串。例如:
char str[] = "Hello, world!";
这个字符数组就是一个字符串,它包含了13个字符。
问题:如何查找字符串中字符的最小出现次数?
分析问题
我们需要遍历整个字符串,对于每个字符,统计它出现的次数,最后找出最小值即可。这个过程可以分为两个步骤:
遍历字符串,统计每个字符出现的次数
找出出现次数最小的字符
解决问题-步骤1:遍历字符串,统计每个字符出现的次数
我们可以用一个整型数组来记录每个字符在字符串中出现的次数。首先我们需要初始化这个数组,将所有元素的值设置为0。然后遍历整个字符串,对于每个字符,将对应元素的值加1。
void countChars(char* str, int* count) {
for (int i = 0; str[i] != '\0'; i++) {
count[str[i]]++;
}
}
这个函数接受一个字符数组和一个整型数组作为参数,其中字符数组表示要统计的字符串,整型数组表示每个字符在字符串中出现的次数。
解决问题-步骤2:找出出现次数最小的字符
我们可以遍历整个字符数组,记录出现次数最小的字符。然而,由于字符的ASCII码不一定连续,所以我们需要遍历整个整型数组,依次寻找出现次数最小的元素。
char findMinChar(int* count) {
int minCount = INT_MAX; // INT_MAX是一个常量,表示int类型的最大值
char ch;
for (int i = 0; i < 256; i++) { // ASCII码共有256个字符
if (count[i] > 0 && count[i] < minCount) {
minCount = count[i];
ch = (char)i;
}
}
return ch;
}
这个函数接受一个整型数组作为参数,返回出现次数最小的字符。
完整代码
下面是将上面两个函数集成在一起的完整代码:
#include <stdio.h>
#include <limits.h> // 包含INT_MAX常量的头文件
void countChars(char* str, int* count) {
for (int i = 0; str[i] != '\0'; i++) {
count[str[i]]++;
}
}
char findMinChar(int* count) {
int minCount = INT_MAX;
char ch;
for (int i = 0; i < 256; i++) { // ASCII码共有256个字符
if (count[i] > 0 && count[i] < minCount) {
minCount = count[i];
ch = (char)i;
}
}
return ch;
}
int main() {
char str[100];
int count[256] = {0}; // 初始化数组
printf("请输入一个字符串:");
scanf("%s", str);
countChars(str, count);
char ch = findMinChar(count);
printf("出现次数最小的字符是:%c\n", ch);
return 0;
}
测试
下面是几组测试样例及输出结果:
测试样例1:
输入:Hello, world!
输出:出现次数最小的字符是:H
测试样例2:
输入:abcabcabc
输出:出现次数最小的字符是:b