华为机试_HJ27 查找兄弟单词【中等】

此篇博客介绍了如何编写一个程序,通过输入一组单词和一个目标词x,找出x的所有兄弟单词,并按字典序排列找出第k个。关键步骤包括判断是否为兄弟单词、存储兄弟单词、排序并输出第k个。

目录

描述

输入描述:

输出描述:

解题过程

提交代码

学习代码

代码一

收藏点


描述

定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。

兄弟单词要求和原来的单词不同。例如: ab 和 ba 是兄弟单词。 ab 和 ab 则不是兄弟单词。

现在给定你 n 个单词,另外再给你一个单词 x ,让你寻找 x 的兄弟单词里,按字典序排列后的第 k 个单词是什么?

注意:字典中可能有重复单词。

数据范围:1≤n≤1000 ,输入的字符串长度满足 1≤len(str)≤10  ,1≤k<n 

输入描述:

输入只有一行。 先输入字典中单词的个数n,再输入n个单词作为字典单词。 然后输入一个单词x 最后后输入一个整数k

输出描述:

第一行输出查找到x的兄弟单词的个数m 第二行输出查找到的按照字典顺序排序后的第k个兄弟单词,没有符合第k个的话则不用输出。

解题过程

我的思路是,设置一个二维数组用来存放兄弟单词。

1. 判断是否为兄弟单词(根据单词的长度是否相等,以及是否是原来的单词)

2. 如果是兄弟单词,存进二维数组中;

3. 把二维数组每一个行进行字典序排序,使用strcmp函数;

4. 输出二维数组中第k个兄弟单词,即第k行

提交代码

学习代码

代码一

(来源:https://blog.nowcoder.net/n/97fe91225e2247b9bd49cf22058488cc

我觉得他和我的思路是一样的

#include <string.h>

int main()
{
    int x,i,j,k,n,num=1,cet=0,y,z;
    scanf("%d",&x);
     
    char str[x][12],word[12]={0},str1[x][12],temp[12];
    memset(str, '\0', sizeof(str));
    memset(str1, '\0', sizeof(str1));
    for(i=0;i<x;i++)
    {
        scanf("%s",&str[i]);
    }
    scanf("%s",word);
     scanf("%d",&z);
    for(i=0;i<10;i++)
    {
        if(word[i]!='\0')
            num*=word[i];
        else
            break;
    }
    for(j=0;j<x;j++)
    {   y=1;
        for(k=0;k<i;k++)
        {
            y*=str[j][k];
        }
        if(y==num&&str[j][i]=='\0')
        {
         strcpy(str1[cet++], str[j]);
        }
} 
    y=cet;
    for(j=0;j<y;j++)
    {
        if(strstr(str1[j],word)!=NULL)
        {cet--;
           str1[j][0]='~';
        }
    }

    printf("%d\n",cet);
    if(cet>=z)
    {for(j=0;j<y;j++)
    {
        for(k=j;k<y;k++)
        {
            for(n=0;n<i;n++)
            {
                if(str1[j][n]<str1[k][n])
                 break;
                if(str1[j][n]>str1[k][n])
            {
                strcpy(temp,str1[j]);
                strcpy(str1[j],str1[k]);
                strcpy(str1[k],temp);
               break;
            }
            }
        }
    }
    printf("%s\n",str1[z-1]);
    }
}

收藏点

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值