牛客编程题

提示:文章

文章目录

前言

前期疑问:
本文目标:


一、背景

最近

二、HJ17坐标移动

2.1 AC版

HJ17坐标移动

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include "string.h"
#include "stdbool.h"

typedef struct {
    char a;
    int len;
} moveData;

bool isTargetStr(char* str) {
    int len = strlen(str);
    if(len < 2)
    {
        return false;
    }
    if (!isalpha(str[0])) {
        return false;
    }
    for (int i = 1; i < len; i++) {
        if (!isdigit(str[i])) {
            return false;
        }
    }

    return true;
}

void getData(char* str, char* c, int* len) {
    *c = str[0];
    *len = atoi(&str[1]);
}

int* calculateDst2(moveData* data, int count, int array[]) {
    for (int i = 0; i < count; i++) {
        if (data[i].a == 'a') {
            array[0] = array[0] - data[i].len;
        } else if (data[i].a == 'd') {
            array[0] = array[0] + data[i].len;
        } else if (data[i].a == 'w') {
            array[1] = array[1] + data[i].len;
        } else if (data[i].a == 's') {
            array[1] = array[1] - data[i].len;
        }
    }

    return array;
}

void calculateDst(moveData* data, int count, int (*array)[]) {
    for (int i = 0; i < count; i++) {
        if (data[i].a == 'a') {
            *(*array) = *(*array) - data[i].len;
        } else if (data[i].a == 'd') {
            *(*array) = *(*array) + data[i].len;
        } else if (data[i].a == 'w') {
            *(*array + 1) = *(*array + 1) + data[i].len;
        } else if (data[i].a == 's') {
            *(*array + 1) = *(*array + 1) - data[i].len;
        }
    }
}

moveData data[10000];
int main() {
    char str[10000];
    char retStr[50] = {'\0'};
    //while (gets(str) != NULL) { // 注意 while 处理多个 case
    while (scanf("%s", str) != EOF) {
        // 64 位输出请用 printf("%lld") to
        int len = strlen(str);
        char dstStr[10000] = {'\0'};
        int moveDataIndex = 0;
        int index = 0;
        for (int i = 0; i < len ; i++) {
            if (str[i] == ';') {
                continue;
            }
            while (str[i] != ';') {
                dstStr[index++] = str[i++];
            }
            index = 0;

            if (isTargetStr(dstStr)) {
                char charater;
                int length;
                getData(dstStr, &charater, &length);
                data[moveDataIndex].a = tolower(charater);
                data[moveDataIndex].len = length;
                moveDataIndex++;
            }
            memset(dstStr, '\0', sizeof(dstStr));
        }
        int array[2] = {0};
        calculateDst(data, moveDataIndex, &array);

        snprintf(retStr, sizeof(retStr), "%d", array[0]);
        int retStrIndex = strlen(retStr);
        retStr[retStrIndex] = ',';
        snprintf(&retStr[retStrIndex + 1], sizeof(retStr), "%d", array[1]);
        printf("%s", retStr);
    }
    return 0;
}

下面是第一版有问题的版本

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include "string.h"
#include "stdbool.h"

typedef struct {
    char a;
    int len;
} moveData;

bool isTargetStr(char* str) {
    int len = strlen(str);
    if (!isalpha(str[0])) {
        return false;
    }
    for (int i = 1; i < len; i++) {
        if (!isdigit(str[i])) {
            return false;
        }
    }

    return true;
}

void getData(char* str, char* c, int* len) {
    *c = str[0];
    //printf("%s\n", &str[1]);
    *len = atoi(&str[1]);
}

int* calculateDst(moveData* data, int count, int array[]) {
    for (int i = 0; i < count; i++) {
        if (data[i].a == 'a') {
            array[0] = array[0] - data[i].len;
        } else if (data[i].a == 'd') {
            array[0] = array[0] + data[i].len;
        } else if (data[i].a == 'w') {
            array[1] = array[1] + data[i].len;
        } else if (data[i].a == 's') {
            array[1] = array[1] - data[i].len;
        }
    }

    return array;
}

moveData data[10000];
int main() {
    char str[10000];
    char retStr[50] = {'\0'};
    //while (gets(str) != NULL) { // 注意 while 处理多个 case
    while (scanf("%s", str) != EOF) {
        // 64 位输出请用 printf("%lld") to
        int len = strlen(str);
        char dstStr[10000] = {'\0'};
        int moveDataIndex = 0;
        int index = 0;
        for (int i = 0; i < len ; i++) {
            if (str[i] != ';') {
                dstStr[index++] = str[i];
            }
            else {
                index = 0;
                i++;
            }
            
            if (isTargetStr(dstStr)) {
                char charater;
                int length;
                getData(dstStr, &charater, &length);
                printf("%c %d", charater, length);
                data[moveDataIndex++].a = tolower(charater);
                data[moveDataIndex++].len = length;
            }
        }
        int array[2] = {0};
        //array = calculateDst(data, moveDataIndex, array);
        calculateDst(data, moveDataIndex, array);
        //printf("%d %d", array[0], array[1]);

        snprintf(retStr, sizeof(retStr), "%d", array[0]);
        int retStrIndex = strlen(retStr);
        retStr[retStrIndex] = ',';
        snprintf(&retStr[retStrIndex + 1], sizeof(retStr), "%d", array[1]);
        //itoa(array[0], retStr, 10);
        //retStr[1] = ',';
        //retStr[2] = itoa(array[1]);
        printf("%s", retStr);
    }
    return 0;
}

2.2 编程总结:

1、赋值时使用++,但是使用了两次导致程序异常。之前也出现过这个问题。
2、使用gets的时候懵逼了。
3、数组传参传地址在函数中修改时懵逼了。
4、将sourceStr赋值给dstStr时,使用的if没处理好
5、dstStr没有用memset清空,导致程序异常
6、修正了fgets的用法。帖子链接

三、HJ22汽水瓶

HJ22汽水瓶

3.1 代码

3.1.1 AC版

#include <stdio.h>

int getValue(int bottleNum)
{
    if(bottleNum == 1)
    {
        return 0;
    }
    else if(bottleNum == 2)
    {
        return 1;
    }
    else if (bottleNum > 2) {
        return bottleNum / 3 + getValue(bottleNum / 3 + bottleNum % 3);
    }
    return 0;
}

int main() {
    int num;
    while (scanf("%d", &num) != EOF) { // 注意 while 处理多个 case
        // 64 位输出请用 printf("%lld") to 
        //printf("%d\n", num);
        if(num == 0)
        {
            break;
        }

        int value = getValue(num);
        printf("%d\n", value);
    }
    return 0;
}

3.1.2 前一版

#include <stdio.h>

int getValue(int bottleNum)
{
    if(bottleNum == 1)
    {
        return 0;
    }
    else if(bottleNum == 2)
    {
        return 1;
    }
    else if (bottleNum > 2) {
        return bottleNum / 3 + getValue(bottleNum % 3);
    }
    return 0;
}

int main() {
    int num;
    while (scanf("%d", &num) != EOF) { // 注意 while 处理多个 case
        // 64 位输出请用 printf("%lld") to 
        //printf("%d\n", num);
        if(num == 0)
        {
            break;
        }

        int value = getValue(num);
        printf("%d\n", value);
    }
    return 0;
}

3.2 编程总结

牛客上这题我是没通过的,之前可能也是很费脑子的,但是今天花了两三分钟就ac了。这么来说其实还是有进步的。
只要能进步其实就很不错了。如果快不了,那就慢慢来吧。


总结

未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值