题目描述
编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。
思路:定义一个大小位ASCII码大小的数组(128),从输入的数组str中的每个元素中,以str[i]为定义数组的下标,以出现的次数来增加定义数组对应下标的值
#include
int countDistinctChars(char* str) {
int chars[128] = {0}; // 用于记录每个字符的出现次数,初始值为0
int count = 0; // 不同字符的个数
int i=0;
// 遍历字符串,统计字符的出现次数
while(str[i]!='\0')
{
// 如果字符在 ASCII 码范围内,并且第一次出现,则增加不同字符的个数
if (str[i] >= 0 && str[i] <= 127 && chars[str[i]] == 0) {
count++;
}
chars[str[i]]++;
i++; // 将字符的出现次数加1
}
return count;
}
int main(){
char str[501]={0};
scanf("%s",&str);
int k=countDistinctChars(str);
printf("%d",k);
return 0;
}
题目描述
给定一个大小为
n
的数组nums
,返回其中的多数元素。多数元素是指在数组中出现次数 大于⌊ n/2 ⌋
的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素。
思路:
法一
可以使用摩尔投票算法来解决这个问题。
摩尔投票算法的基本思想是假设数组中的第一个数是多数元素,然后遍历数组,如果遇到相同的数则计数器加一,否则计数器减一。当计数器归零时,假设的多数元素不再是多数元素,重新设定遇到的下一个数为多数元素。
int majorityElement(int* nums, int numsSize) {
int candidate = nums[0];
int count = 1;
for (int i = 1; i < numsSize; i++) {
if (count == 0) {
candidate = nums[i];
count = 1;
} else if (nums[i] == candidate) {
count++;
} else {
count--;
}
}
return candidate;
}
法二
可以先将数组进行冒牌排序,然后多数元素便会出现再数组的中间,返回数组元素的中间值既可(冒泡排序+取中间)
#include
int cmp(const void*a,const void*b){
return *(int*)a-*(int*)b;
}
int majorityElement(int* nums, int numsSize){
qsort(nums,numsSize,sizeof(int),cmp);
return nums[numsSize/2];
}
//int majorityElement(int* nums, int numsSize)
//{
// int tem = nums[0];
// for (int i = 0;i < numsSize;i++)
// {
// for (int j = i + 1;j < numsSize;j++)
// {
// if (nums[i] > nums[j])
// {
// tem = nums[i];
// nums[i] = nums[j];
// nums[j] = tem;
// }
// }
// }
// return nums[numsSize / 2];
//}