本专栏为c语言练习专栏,适合刚刚学完c语言的初学者。本专栏每天会不定时更新,通过每天练习,进一步对c语言的重难点知识进行更深入的学习。
今日练习题关键字:字符个数统计 多数元素 投票法
题目一:
题目描述:
编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。
数据范围: 1≤n≤500
解题思路:
运用的是HASH表的思想,因为只有最多只有128种数据,所以只需维护一个大小为128的字符数组,让输入的字符作为数组下标,取出这个下标数组中的字符直接与输入的字符比较(不用for循环从头再查),如果相同则跳过,不同则赋值,让结果++,最后遇到’\n’结束循环,返回结果即可。
代码实现:
#include<stdio.h> int main() { int hash[128] = {0}; char B; int count = 0; while (scanf("%1c", &B) != EOF) { int asc = (int)B; if (hash[asc] != 1) { count++; hash[asc] = 1; } } printf("%d", count - 1); //需要去掉最后的回车键 }
结果情况:
符合题目要求,问题得到解决。
题目二:
题目描述:
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
解题思路:
投票法:
因为多数元素在数组里出现的次数绝对大于n/2,所以用不同元素消去相同元素,剩下的必然是相同元素
代码实现:
int majorityElement(int* nums, int numsSize) { int candidate=nums[0];//投票对象 int count=1;//票数 for(int i=1;i<numsSize;i++)//遍历投票对象 { if(nums[i]==candidate)//投票对象相同,票数+1 { count++; } else//投票对象不同,票数-1 { count--; if(count<0)//该元素不是多数元素,更新投票对象candidate并把票数置1 { candidate=nums[i]; count=1; } } } return candidate; }
结果情况:
符合题目要求,问题得到解决。
总结:
文章到这里就要告一段落了,有更好的想法或问题,欢迎评论区留言。
希望今天的练习能对您有所收获,咱们下期见!