网易笔试编程题详解

题目一 彩砖的问题

网易笔试编程题详解_第1张图片

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

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

具体的代码如下:

#include
#include
#include

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串的问题

网易笔试编程题详解_第2张图片

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

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

具体代码如下:

#include
#include
#include

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;   
} 

题目三 独立的小易

网易笔试编程题详解_第3张图片

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

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

具体的代码如下:

#include
#include


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;
}

题目四 等差数列

网易笔试编程题详解_第4张图片

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

代码如下:

#include
#include

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;   
}

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

你可能感兴趣的:(数据结构与算法)