一.题目描述
写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字母,然后输出输入字符串中该字母的出现次数。不区分大小写。
输入描述:
第一行输入一个由字母和数字以及空格组成的字符串,第二行输入一个字母。
输出描述:
输出输入字符串中含有该字符的个数。
解题思路:
1.题目没有给出明确的输入字符数,所有初始化阶段分配给buf的内存越大意味着,程序花费的内存越大(稍微有点疑问)
2.条件判断的话 只有1个关键,取决于第二次输入的字母,有三个判断条件
本身寻找的时候恰好相等 ,要不就是大写字母,要不就是小写字母
3.就本身的效率而言,fgets > scanf 所以优先选择 fgets (scanf 最少比fgets多一次copy)
4.目前来看时间复杂度是 n ;
```c
#include <stdio.h>
#include <string.h>
int main(void){
char buf[5000];
fgets(buf,5000,stdin);
int i = 0;
int len = strlen(buf);
char ch = getchar();
while(len--){
if(buf[len] == ch || buf[len] == ch+32 || buf[len] == ch-32){
i++;
}
}
printf("%d\n",i);
}
题目描述
•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组;
•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
输入描述:
连续输入字符串(输入多次,每个字符串长度小于100)
输出描述:
输出到长度为8的新字符串数组
解题思路:
1.首先看到的是固定的字符串长度8个字节
2.然后根据C的特性,可以直接通过强制类型转换数据存储的,状态,由于不是经常刷题,手生,直接可以通过多维数组转换进行解题
测试效率是2ms,勉强过的去
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//多维数组的转化问题
int main(void){
char buf[100];
int CTRL = 100 / 8;
char complete[CTRL+1][8];
int len,i = 0,len_t;
while(~scanf("%s",buf))
{
memset(complete,0,(CTRL+1)*8);
len = strlen(buf);
if(len > 8){
for( i = 0 ; i <= len/8 ; i++){
strncpy(complete[i],buf+8*i,8);
if( i != len/8 ){
printf("%s\n",complete[i]);
}
}
if((len_t = strlen(complete[--i])) < 8 && len_t != 0){
memset(complete[i]+len_t,'0',8-len_t);
printf("%s\n",complete[i]);
}
}else if(len <= 8 && len != 0){
strncpy(complete[i],buf,8);
memset(complete[i]+len,'0',8-len);
printf("%s\n",complete[i]);
}
}
}