HJ27 查找兄弟单词

提示:文章

文章目录

前言

前期疑问:
本文目标:


一、背景

最近

二、

2.1 HJ27 查找兄弟单词

3.1 第一版

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

// 比较函数,用于qsort函数排序
int compareCharacter(void* a, void* b)
{
    return *(char*)a - *(char*)b;
}

int compareWord(void* a, void* b)
{
    return strcmp((char*)a, (char*)b);
}

int main() {
    int num, index;
    int count = 0;
    char word[11] = {'\0'};
    scanf("%d", &num);
    char str[num][11];
    for(int i = 0; i < num; i++)
    {
        scanf("%s",str[i]);
    }
    scanf("%s",word);
    scanf("%d",&index);

    qsort(word, strlen(word), sizeof(char), compareWord);
    for(int i = 0; i < num; i++)
    {
        if(strlen(str[i]) != strlen(word))
        {
            continue;
        }
        else if (strcmp(str[i],word) == 0) {
            continue;
        }
        char temp[11] = {'\0'};
        strcpy(temp, str[i]);
        qsort(temp, strlen(temp), sizeof(char), compareWord);
        if(strcmp(temp, word) == 0)
        {
            strcpy(str[count++], str[i]);
        }
    }

    printf("%d\n",count);
    if(index <= count)
    {
        qsort(str, count, sizeof(*str), compareWord);

        printf("%s",str[index-1]);
    }
}

476 cb cba baad cbdb bdb acacd aba b cbbc b ccd d ddb acdab bab acc bc dccab bb daa cdcc dc adcab bd bbcab abc ba dd bdb dbbc ddbcd ab cc a c accb ddd cbc adb aad badd ad bac a addcb bcab d ccd b bc cdc acac adad d c ddc aba cac db dc aadbd bc cad baaa aaa d cddcc dabaa daa dcaac d db bab dbbbc cd acaab abbdc cda dddad a dbda cba cd dda bcca ccaca adbb bad c ba a ca d aca b bbdd dad bbcd abbcb ac aabac ca b ac dbbab bba bdcc cacbb bd a cbba badad ab ccda b c abcdc d bdab cbc ad dbcc bbddc ba caa ccac aadaa daad aacc dc dcb bca ab ccdda d cbbcc da ac b dcdba a adac ab dcc adac dd c bd bcd c ccbb dba abcb b cddc ccada dada dcca ddbbd c bda bac b bdbb bbba bdaa dda ac dd dcbbd ddccc badd adddd cba b b bbcab bcac bdad a adbd da ac adbbb cbbb caadb ab dc bdbc d c adb ab aadbd abad aaadc adcc b bbadd bbbc da acbb cbbdb bcdcc a bc ddba abadd ddc ada b bbcdc a bbccb bb a b cdac aab d dadad bad aabb dccba cd d cda b add dcacc bccdc add dc a cccd b aa ac dacbc a badb b dabbc b ddb acc c c a bc bc bcc dadc dad bba cbd b aa cbb a ababc da bc dcbcc dcbb aaad bdac ddbc bbbb bdbca d a cadac aaa dcd cc b dccba aadbd ddbbc aadb bca dcdcc a d c d b dbc abddb ccadb ccca ddda cd bbda adc ba bab adadb aaaa dbac abac acbb a cbd a dbdcd cdc c daaba a bc dabb bc aaadc b bdcc baaa addb ad dbdca cbb cbdd dc d dcbb bdd dca cad ddd cdbdd ca d c cd ddcda badb ab ba bc dcd add cc bb d dcda bbc abdb bd ba abcb d c ddaab cbbc cad bdb ba ba dbdcb dcddb dd cbdc cdd b cbcdb add bba bcaba d aba d cbcba bacb a abbca cdabc bdaa dbd bd ddc bacc bbcdc c bdbbb dd b cdc ba daaba ab b caac baad dcaca cda cbc cbdba bd dbbba aad b bbbba bbdc cdbb abc ddaa d c c bcd dcb adabd c bbc bb cd bccc ac d bbb cbd ad aad bcbaa bda ad d badba a a aa abacc cd bbbc d b ccbb dccad a ac bcbc bddc ddcad ddcb dd a dacb dddad dcb ac add ddc aa cc b ad baccb cda cbbdd adab abbdb c d bcb b ca cbdbd abbc dc abd bac bab bbb bcab cdaab bbaa 3
这个案例没通过

3.2 第二版

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

int compare(const void* a, const void* b)
{
    return *(char*)a - *(char*)b;
}

int compareStr(const void* a, const void* b)
{
    return compare(a, b);
}

int main() {
    int count = 0;
    char str[11];
    int index = 0;
    while (scanf("%d", &count) != EOF) { // 注意 while 处理多个 case
        // 64 位输出请用 printf("%lld") to 
        char array[count];
        char strArray[1001][11] = {'\0'};
        char dstStrArray[1001][11] = {'\0'};
        
        for(int i = 0; i < count; i++)
        {
            scanf("%s", strArray[i]);
        }
        scanf("%s", str);
        scanf("%d", &index);

        char strCopy[11] = {'\0'};
        strcpy(strCopy, str);
        qsort(strCopy, strlen(str), sizeof(char), compare);             //这边还有逻辑错误,不能直接把str排序

        int dstStrIndex = 0;
        for(int i = 0; i < count; i++)
        {
            if(strcmp(strArray[i], "aabb") == 0)
            {
                int j = 0;
            }
            char tempStr[11];
            memcpy(tempStr, strArray[i], sizeof(tempStr));          //这边长度写为strlen(strArray[i]),会导致程序异常
            if(strcmp(str, tempStr) == 0)
            {
                continue;
            }
            qsort(tempStr, strlen(tempStr), sizeof(char), compare);
            if(strcmp(strCopy, tempStr) == 0)
            {
                strcpy(dstStrArray[dstStrIndex++], strArray[i]);
            }
        }

        if(count == 854)
        {
            for(int i = 0; i < dstStrIndex; i++)
            {
                printf("%s\n", dstStrArray[i]);
            }
        }

        qsort(dstStrArray, dstStrIndex, 11, compareStr);
        printf("%d\n",dstStrIndex);
        if(index - 1 >= 0)
        {
            printf("%s\n",dstStrArray[index - 1]);
        }
    }
    return 0;
}

第二版通过了上述的示例,是因为自己的逻辑写错了,一开始就把str排序了,肯定不对。
但是这版代码也有示例没通过。
代码有个示例没有通过,那个示例特别长看不到全部,大概是因为

bcaa
aacb
abac
aabc
cbaa
5
aabc

所以是因为字符串数组排序问题。

3.2 第三版

参考别人代码,下了下面的测试代码

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "string.h"

int compareStr(const void* a, const void* b)
{
    return strcmp((char*)a, (char*)b);
}

int main()
{
    char str[5][11] = {"bcaa", "aacb", "abac", "aabc", "cbaa"};
    qsort(str, 5, sizeof(*str), compareStr);
    for(int i = 0; i < 5; i++)
    {
        printf("%s\n", str[i]);
    }
}

字符串数组排序成功。
修改代码如下

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

int compare(const void* a, const void* b)
{
    return *(char*)a - *(char*)b;
}

int compareStr(const void* a, const void* b)
{
    return strcmp((char*)a, (char*)b);
}

int main() {
    int count = 0;
    char str[11];
    int index = 0;
    while (scanf("%d", &count) != EOF) { // 注意 while 处理多个 case
        // 64 位输出请用 printf("%lld") to 
        char array[count];
        char strArray[1001][11] = {'\0'};
        char dstStrArray[1001][11] = {'\0'};
        
        for(int i = 0; i < count; i++)
        {
            scanf("%s", strArray[i]);
        }
        scanf("%s", str);
        scanf("%d", &index);

        char strCopy[11] = {'\0'};
        strcpy(strCopy, str);
        qsort(strCopy, strlen(str), sizeof(char), compare);             //这边还有逻辑错误,不能直接把str排序

        int dstStrIndex = 0;
        for(int i = 0; i < count; i++)
        {
            if(strcmp(strArray[i], "aabb") == 0)
            {
                int j = 0;
            }
            char tempStr[11];
            memcpy(tempStr, strArray[i], sizeof(tempStr));          //这边长度写为strlen(strArray[i]),会导致程序异常
            if(strcmp(str, tempStr) == 0)
            {
                continue;
            }
            qsort(tempStr, strlen(tempStr), sizeof(char), compare);
            if(strcmp(strCopy, tempStr) == 0)
            {
                strcpy(dstStrArray[dstStrIndex++], strArray[i]);
            }
        }

        qsort(dstStrArray, dstStrIndex, sizeof(*dstStrArray), compareStr);
        printf("%d\n",dstStrIndex);
        if(index - 1 >= 0)
        {
            printf("%s\n",dstStrArray[index - 1]);
        }
    }
    return 0;
}

ac成功,这样看之前代码简直瞎写。

3.3 总结

主要错误有以下几个点:
1、qsort中写成了compare函数,这样不知道是什么函数。。。
2、qsort对字符串数组排序的时候,传参写错了。
下面的帖子写的关于qsort的用法比较详细
qsort用法

2024年4月1日20:04:03更新
对于上述代码,使用的dstStrArray方式是**char dstStrArray[1001][11] = {‘\0’};**也可以使用这种方式:char dstStrArray[count][11];,但是我在实际使用过程中发现会报错。现在知道原因是因为我写成这种方式:char dstStrArray[count][11] = {‘\0’};,C99之后可以使用变量声明数组,但是申明的时候不能初始化。

2.2

三、

3.1


总结

未完待续

  • 11
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值