网易笔试编程题详解

来源:互联网 发布:淘宝情侣装秋冬装 编辑:程序博客网 时间:2024/05/17 06:27

题目一 彩砖的问题

这里写图片描述

解析:在答这道题的时候,我分析出,首先是和字母的种类数有关系的,当这个种类数为2的时候,它是存在的,而且结果是2,因为BBAA与AABB,当这个种类数为3或者大于3的时候,这个时候是不存在,因为,只要第三种和前两种相邻,这个结果就是大于1的,对于种类数为0和1的情况,我都认为是0(理解错误),在这一块,我犯了错误,题目中是“最多存在一对不同颜色的相邻砖块”,也就是说包含着一对都不存在的情况,我把这点忽略,这种在脑海浮现过,只是我认为它不符合而已,所以,正确的结论是,当种类数大于2的时候,结果就是0,当种类数小于2的时候,种类数就是最后的结果

总结:在这个过程中我遇到的第一个难点就是,如何得到这个种类数,我想到的思路就是遍历字符串,将统计的结果放到一个空数组中,这个时候我想到了自己之前的做法,以大写字母的ASCII码值作为下标,但是一想这次只有26个字母,空间太浪费了,所以我打算这个数组只存储这26的字母,所以我就想到’A’对应的下标就是0,然后就想到了用字母-A作为统计数组的下标

具体的代码如下:

#include<stdio.h>#include<stdlib.h>#include<string.h>int main(void) {    char str[50];    int a[26] = {0};    int i = 0;    int type = 0;    gets(str);    for(i = 0; i < strlen(str); i++) {        a[str[i] - 'A']++;      }    for(i = 0; i < 26; i++) {        if(a[i]) {            type++;        }    }    if(type > 2) {        printf("0");        return 0;    }else{        printf("%d", type);     }     return 0;}

题目二 01串的问题

这里写图片描述

解析:就是遍历输入的串,然后查看该字符与下一个字符是否相等,如果相等则将记录字串长度的变量(t)清零,否则t++,然后比较t与num的大小,num的作用就是记录一个最大值

总结:就是要注意一些特殊值,一种情况结束后,需要立即return

具体代码如下:

#include<stdio.h>#include<stdlib.h>#include<string.h>int main(void) {    //求最长的01串    char str[50];     int i = 0;    int num = 0;    int t = 0;    gets(str);    if(strlen(str) == 0) {        printf("0");        return 0;    }    if(strlen(str) == 1) {        printf("1");         return 0;    }    for(i = 0; i < strlen(str) && i + 1 < strlen(str);  i++) {        if(str[i] != str[i+1]) {            t++;        }else {            t = 0;        }        if(num < t) {            num = t;        }    }    printf("%d", num+1);    return 0;   } 

题目三 独立的小易

这里写图片描述

解析:这个题目主要就是解一个方程,假设在吃完f个水果之后,还可以维持n天,则有x*n + n*p = d-f*x,然后再加上f,就是这种情况下的天数,该情况就是d/x >= f,在初次考虑的时候,我没有考虑到这样一点,只是单纯的去解了方程,在意识到之后,我又加入了对于d/x < f情况的处理,也就是说此时的天数就是d/x

总结:在思考的时候需要全面一些,要不然就会漏掉某些情况

具体的代码如下:

#include<stdio.h>#include<stdlib.h>int main(void) {    //x每天房租  f已经有的水果 d有的钱  p水果的单价     int x, f, d, p;    scanf("%d", &x);    scanf("%d", &f);    scanf("%d", &d);    scanf("%d", &p);    /*    这种情况已经涵盖在下面的情况中了    if(d == 0 || d < x) {        printf("0");        return 0;    }*/      if(d/x < f) {        printf("%d", d/x);        return 0;    }    int money = d - f * x;    int day = money / (x + p);    printf("%d", day + f);    return 0;}

题目四 等差数列

这里写图片描述

分析:看到这道题目的时候,我就注意到这个d,而等差数列这个就让我联想到很多,它是单调的,所以在一个有序的数列中,相邻的两个数就相差一个|d|,所以我想到的就是先给它排个序,然后相邻比较,看它们是不是相差一个d

代码如下:

#include<stdio.h>#include<stdlib.h>int main(void) {    int a[50];    int n, i, j;    scanf("%d", &n);    for(i = 0; i < n; i++) {        scanf("%d", &a[i]);    }    for(i = 0; i < n; i++) {        for(j = i+1; j < n; j++) {            if(a[i] > a[j]) {                int tmp = a[i];                a[i] = a[j];                a[j] = tmp;            }        }    }    int d = a[1] - a[0];    for(i = 1; i < n; i++) {        if(a[i+1] - a[i] != d && i+1 < n) {            printf("Impossible");            return 0;        }    }    printf("Possible");    return 0;   }

感觉在做编程题目的时候还是需要读懂题,注意条件的一个划分和一些细节问题

原创粉丝点击