299-e-Bulls and Cows

来源:互联网 发布:网站流量统计工具 知乎 编辑:程序博客网 时间:2024/06/10 01:35

数字游戏,根据提示猜数字。乍一看就是哈希了,好像不难上手就写,但后来发现自己根本没完全理解要求导致老是错误。难点在于当有重复数字时确定那个cows,也就是b。反正自己写了蛮久cows的逻辑,我只看出了b不能大于secret中该字的出现次数,然后就是改啊改的,就是不完全对。原因在于自己没有搞懂它确定的逻辑到底是什么。提交了n次后怒查答案,发现有个思路是将secret和guess都哈希然后其各位最小值之和就是bulls和cows之和,bulls很好确定,于是相减就得出b了。至于为什么是bulls和cows之和我还得想想,但反正ac了。另外就是由于是c写的,而b可能大于10,所以还得处理字符串貌似我的ide还用不乐itoa,真是不省心。。。

反正写的不好,ac代码如下:

char *int2str(char *result, int num) {    if (num == 0) {        return result;    }        int a = num % 10;    num /= 10;        int2str(result, num);        result[strlen(result)] = a + 48;    result[strlen(result)] = '\0';        return result;}char* getHint(char* secret, char* guess) {    int a = 0, b = 0, sp = 0, gp = 0;    int *hashSecret = (int *)calloc(10, sizeof(int)); //表示原表各个数字个数的表    int *hashSource = (int *)calloc(10, sizeof(int)); //动态求哈希值时表征原表的表    int *hashGuess = (int *)calloc(10, sizeof(int));  //动态表征猜表的表    memset(hashSecret, 0, sizeof(int) * 10);    memset(hashSource, 0, sizeof(int) * 10);    memset(hashGuess, 0, sizeof(int) * 10);        for (int i = 0; secret[i] != '\0'; i++) {        sp = secret[i] - 48;        hashSecret[sp] += 1;        gp = guess[i] - 48;        hashGuess[gp] += 1;                if (secret[i] == guess[i])            a++;    }        for (int i = 0; i < 10; i++) {        printf("%d: sec-->%d, source-->%d, gue-->%d\n", i, hashSecret[i], hashSource[i], hashGuess[i]);    }        int tmpa = 0, tmpb = 0;    int secCount = 0, ammu = 0;    for (int i = 0; i < 10; i++) {        tmpa = hashSource[i];        tmpb = hashGuess[i];        secCount = hashSecret[i];                if (tmpb <= secCount)            ammu += tmpb;        else            ammu += secCount;    }    b = ammu - a;            char *result = (char *)calloc(10,sizeof(char));    char *as = NULL, *bs = NULL;        if (a != 0) {        as = (char *)calloc(32, sizeof(char));        int2str(as, a);        for (int i = 0; as[i] != '\0'; i++)            result[i] = as[i];    }    else        result[0] = '0';    result[strlen(result)] = 'A';    if (b != 0) {        bs = (char *)calloc(32, sizeof(char));        int2str(bs, b);        for (int i = strlen(result), j = 0; bs[j] != '\0'; i++, j++)            result[i] = bs[j];    }    else        result[strlen(result)] = '0';    result[strlen(result)] = 'B';        free(hashSecret);    free(hashGuess);    free(hashSource);        return result;}

0 0
原创粉丝点击