我是靠谱客的博主 呆萌丝袜,最近开发中收集的这篇文章主要介绍华为机试题目一(牛客网)HJ1:字符串最后一个单词的长度HJ2:计算某字母的出现次数HJ3:明明的随机数字符串分隔进制转换,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

HJ1:字符串最后一个单词的长度

在这里插入图片描述在这里插入图片描述

我的代码

#include <stdio.h>
#include <string.h>
#include <math.h>

int main(){
    char str[5000];
    int len=0;
    char space=' ';
    char *p; int start=0;
    fgets(str,5001,stdin);
    p=strrchr(str, space);
    if(p){
        p=p+2;
        while(*(p+start)){
            len++;
            start++;
        }
        printf("%d",len);
    }
    else{
        while(*(str+start)){
            len++;
            start++;
        }
        printf("%d",len-1);
    }
    return 0;
}

1:输入用的fgets,最开始我用gets报段错误;
2:strrchr函数用于定位需要的字符最后一次出现的位置;
多积累字符串函数
3:由于移动问题导致数据+2或者-1,这个我没有仔细去研究,纯粹看输出直接换算的,有时间可以认真研究一下这个移动步位问题。

HJ2:计算某字母的出现次数

题目描述
输入输出示例

我的代码

#include<stdio.h>
#include<string.h>

int main(){
    char str[5000];
    char c,cm;
    int num=0,len=0,i=0;
    fgets(str,5000,stdin);
    c=getchar();
    len=strlen(str);
    if(c>=97){
        cm=c-32;
    }
    else{
        cm=c+32;
    }
    for(i=0;i<len;i++){
        if(str[i]==c||str[i]==cm){
            num++;
        }
    }
    printf("%d",num);
    return 0;
}

这道题算法很简单,但让我浪费了一些时间的是输入输出,由于牛客网的测试环境是循环测试的,一开始我的输入由于字符串的换行问题导致输出一直是num的初始化值。后来修改为图上代码后测试通过。

HJ3:明明的随机数


在这里插入图片描述在这里插入图片描述虽然题目是随机数,实际上跟随机数没什么关系。重点是掌握输入输出和数组。

我的代码

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(){
    int num=0;
    int p=0;
    while(~scanf("%d",&num)){
        int array[1000]={0};
        for(int i=0;i<num;i++){
            scanf("%d",&p);
            array[p]=1;//数组用来标记
        }
        for(int i=0;i<1000;i++){
            if(array[i]==1){
                printf("%dn",i);
            }
        }
    }
   return 0;
}

这个代码中比较重要的部分有两点:
1:while(~scanf("%d",&num))
循环输入多组示例时用语句代表当没有输入时跳出循环,因为没有输入时scanf语句返回-1,用~取反后即为0,此时跳出while语句。

2:for(int i=0;i<num;i++){ scanf("%d",&p); array[p]=1;//数组用来标记 }

这里array数组是用来标记的,当遇到重复数字p时,由于与array数组中的元素冲突,重复不计入,注意输出的是数组下标,而不是数组元素,因为标记的元素都为1.

字符串分隔

在这里插入图片描述在这里插入图片描述

我的代码

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(){
    char str[100]="";
    while(~scanf("%s",str)){
        int len=0;
        len=strlen(str);
        int num=0,stay=0;
        num=len/8;
        stay=len%8;
        if(num==0){
            for(int i=0;i<8;i++){
                if(i<len){
                    printf("%c",str[i]);
                }
                else{
                    printf("0");
                }
            }
            printf("n");
        }
        for(int i=0;i<num;i++){
            for(int j=0;j<8;j++){
                if(str[i*8+j]){
                    printf("%c",str[i*8+j]);
                }
                else{
                    printf("0");
                }
            }
            printf("n");
        }
        if(stay>0&&num>0){
            for(int j=0;j<8;j++){
                if(str[num*8+j]){
                    printf("%c",str[num*8+j]);
                }
                else{
                    printf("0");
                }
            }
            printf("n");
        }
        for(int i=0;i<100;i++){
            str[i]='';
        }
    }
    return 0;
}

我的这个代码事件复杂度并不是很好,牛客上有很多的优秀通过代码。但因为一开始我就按我的思路写了,所以也没有换了。执行过程中最大的问题是临界问题,因为临界问题我修改了好几遍,这里着重标记一下临界的几种情况:

  • 如1234,即一行但不满8个数
  • 如12345678,即一行刚好8个数
  • 如12345678 1234,即多行有余数

即注意第一行和最后一行的临界,讨论他们是8的整数和不是8的整数的情况。
另外一点需要注意的是n的输出,是否输出了多余的回车换行,以及数组的初始化,考虑循环测试模式一定要记得初始化数组。

进制转换

在这里插入图片描述
在这里插入图片描述

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
int main(){
    char str[101];
    while(~scanf("%s",str)){
        int count=0,sum=0,len=0;
        len=strlen(str);
        for(int i=len-1;i>=2;i--){
            if(str[i]<='9'&&str[i]>='0'){
                sum=sum+(str[i]-48)*pow(16,count);
            }
            else if(str[i]>='A'&&str[i]<='F'){
                if(str[i]=='A'){
                    sum=sum+10*pow(16,count);
                }
                else if(str[i]=='B'){
                    sum=sum+11*pow(16,count);
                }
                else if(str[i]=='C'){
                    sum=sum+12*pow(16,count);
                }
                else if(str[i]=='D'){
                    sum=sum+13*pow(16,count);
                }
                else if(str[i]=='E'){
                    sum=sum+14*pow(16,count);
                }
                else if(str[i]=='F'){
                    sum=sum+15*pow(16,count);
                }
            }
            count++;
        }
     printf("%dn",sum);   
    }
    return 0;
}

注意以下几点:
1:将字符型数据转换为整型,比如0-9即str[i]-48即可;
2:注意进制计算,用了幂函数pow;
3:我的代码中A-F的转换属于暴力转换,事实上直接用str[i]-55即可,写代码的时候没想到。

前5题的算法记录到此,总的来说做下来给我最大的感受就是输入输出与临界问题,牛客网还提供了测试,也提供了哪些样例没通过方便检查临界,真正机试时不会提供错误样例,所以自己一定要考虑好临界相关问题,输入输出也要调整好。

最后

以上就是呆萌丝袜为你收集整理的华为机试题目一(牛客网)HJ1:字符串最后一个单词的长度HJ2:计算某字母的出现次数HJ3:明明的随机数字符串分隔进制转换的全部内容,希望文章能够帮你解决华为机试题目一(牛客网)HJ1:字符串最后一个单词的长度HJ2:计算某字母的出现次数HJ3:明明的随机数字符串分隔进制转换所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部