C语言实践练习题----day8

题目一:

题目描述

编写一个函数,计算字符串中含有的不同字符的个数。字符在 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];
//}

你可能感兴趣的:(c语言,算法,开发语言)