牛客网华为机试题 字符串问题 记录

一.题目描述
写出一个程序,接受一个由字母、数字和空格组成的字符串,和一个字母,然后输出输入字符串中该字母的出现次数。不区分大小写。
输入描述:
第一行输入一个由字母和数字以及空格组成的字符串,第二行输入一个字母。
输出描述:
输出输入字符串中含有该字符的个数。

解题思路:
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]);
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值