7-2 统计数字字符
输入一串字符(中间无空格,字符串最长80),统计其中数字字符0-9各出现多少次,输出出现过的数字(每3个字母占一行)及其出现次数。
输入格式:
字符串
输出格式:
输出出现过的数字(每3个字母占一行)及其出现次数。
例如:
1:2次 3:1次
输入样例1:
12edRRde456123232
输出样例1:
1:2次 2:4次 3:2次
4:1次 5:1次 6:1次
输入样例2:
wewQQFTSerfgs
10个数字字符都没出现过
思路 :要统计数字字符个数,用“桶”的思想
定义一个桶a[10],初始值均为0
遍历字符串,如果有数字字符,该数字下标相对应的元素值+1
eg:遇到‘6’,做a['6'-'0']+=1;//将字符数字变成int
#include <stdio.h>
#include <string.h>
int main(void) {
char str[81];
gets(str);
int len = strlen(str);
int a[10] = {0};
for (int i = 0; i < len; i++) {
if (str[i] <= '9' && str[i] >= '0') {
a[str[i] - '0']++;
}
}
int count = 0,flag=0;
for (int i = 0; i < 10; i++) {
if (a[i] > 0) {
flag=1;
count++;
printf("%d:%d次", i, a[i]);
if (count % 3 == 0) {
printf(" \n");
} else {
printf(" ");
}
}
}
if(flag==0){
printf("10个数字字符都没出现过");
}
}
7-1 统计单词的长度
本题目要求编写程序,输入一行字符,统计每个单词的长度。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:
输入给出一行字符。
输出格式:
在一行中输出每个单词的长度。每个数字后有一个空格。
输入样例:
How are you?
输出样例:
3 3 4
思路:
根据题目意思应该以空格来分隔单词
要注意全为空格的情况,用flag来判断是否全为空格
#include<stdio.h>
int main()
{
int count=0;
int flag=0;
char ch;
scanf("%c",&ch);
if(ch!=' ')
count++;
while(ch!='\n'){
scanf("%c",&ch);
if(ch!=' '&&ch!='\n')
count++;
if(ch==' '||ch=='\n'){
if(count!=0){
printf("%d ",count);
flag=1;
}
count=0;
}
}
if(flag!=1){
printf("0 ");
}
return 0;
}
7-8 找出不是两个数组共有的元素
给定两个整型数组,本题要求找出不是两者共有的元素。
输入格式:
输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。
输出格式:
在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。
输入样例:
10 3 -5 2 8 0 3 5 -15 9 100
11 6 4 8 2 6 -5 9 0 100 8 1
输出样例:
3 5 -15 6 4 1
思路:
定义3个数组a,b,c
a,b用来输入两个数组,c来存储不同的数字
依次遍历a,b然后找不同
int main()
{
int n, m;
int i, j;
int a[20], b[20], c[20];
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", a + i);
scanf("%d", &m);
for (int i = 0; i < m; i++)
scanf("%d", b + i);
//判断
int cnt = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
if (a[i] == b[j])
break;
}
if (j == m)
c[cnt++] = a[i];
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
if (b[i] == a[j])
break;
}
if (j == n)
c[cnt++] = b[i];
}
//相同数字不输出
printf("%d", c[0]);
for(i = 1; i < cnt;i++)
{
for (j = 0; j < i; j++)
{
if (c[i] == c[j])
{
break;
}
}
if (j == i)
{
printf(" %d", c[i]);
}
}
return 0;
}
7-3 查找敏感词
安全保密是一项重要的工作,通过查找敏感词可以判定文件中是否涉及涉密。请实现判定特定字符串(字符串长度不超过100)中是否包含敏感词(长度不超过10)的功能。
输入格式:
待检查字符串
敏感词
输出格式:
存在敏感词输出“敏感词的起始位置为X”,否则,输出“没有敏感词”
输入样例1:
hello world! time OK!
time
输出样例1:
敏感词的起始位置为13
输入样例2:
hello world! time OK!
secret
输出样例2:
没有敏感词
思路:
以空格分隔单词,以单词为单位判断是否相同。
如果用每个字符遍历会存在以下问题:
1.存在超时现象
2.如果输入敏感词为单词的字串,也会被判存在,但是实际上不存在敏感词
#include <stdio.h>
#include <string.h>
int main() {
char str[101], word[11];
fgets(str, 101, stdin);
fgets(word, 11, stdin);
int len1 = strlen(str), len2 = strlen(word);
if (word[len2 - 1] == '\n') {
word[len2 - 1] = '\0';
len2--;
}
for (int i = 0; i < len1 - len2 + 1; i++) {
int j;
for (j = 0; j < len2; j++) {
if (str[i + j] != word[j]) {
break;
}
}
if (j == len2) {
printf("敏感词的起始位置为%d", i);
return 0;
}
}
printf("没有敏感词");
return 0;
}
7-15 找最小的字符串
本题要求编写程序,针对输入的N个字符串,输出其中最小的字符串。
输入格式:
输入第一行给出正整数N;随后N行,每行给出一个长度小于80的非空字符串,其中不会出现换行符,空格,制表符。
输出格式:
在一行中用以下格式输出最小的字符串:
Min is: 最小字符串
输入样例:
5
Li
Wang
Zha
Jin
Xian
输出样例:
Min is: Jin
思路:
调用strcmp(s1,s2)函数来判断
strcmp(s1,s2)>0 --> s1>s2
strcmp(s1,s2)==0 --> s1==s2
strcmp(s1,s2)<0 --> s1<s2
#include<stdio.h>
#include<string.h>
int main(void){
int n;
scanf("%d\n",&n);
char str[n][80];
for(int i=0;i<n;i++){
scanf("%s",str[i]);
}
int min=0;
for(int i=0;i<n;i++){
if(strcmp(str[min],str[i])>0)
min=i;
}
printf("Min is: %s",str[min]);
}