提示:文章
文章目录
前言
前期疑问:
本文目标:
一、背景
最近
二、
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
总结
未完待续