题解 | #查找兄弟单词#

查找兄弟单词

https://www.nowcoder.com/practice/03ba8aeeef73400ca7a37a5f3370fe68

package main

import (
	"fmt"
	"sort"
)

func isBrotherWord(word1, word2 string) bool {
	if len(word1) != len(word2) {
		return false
	}
	if word1 == word2 {
		return false
	}
	count1 := make([]int, 26)
	count2 := make([]int, 26)
	for i := 0; i < len(word1); i++ {
		count1[word1[i]-'a']++
		count2[word2[i]-'a']++
	}
	for i := 0; i < 26; i++ {
		if count1[i] != count2[i] {
			return false
		}
	}
	return true
}

func main() {
	var n int
	fmt.Scan(&n)
	words := make([]string, n)
	for i := 0; i < n; i++ {
		fmt.Scan(&words[i])
	}
	var x string
	fmt.Scan(&x)
	var k int
	fmt.Scan(&k)

	brotherWords := make([]string, 0)
	for _, word := range words {
		if isBrotherWord(word, x) {
			brotherWords = append(brotherWords, word)
		}
	}
	sort.Strings(brotherWords)

	m := len(brotherWords)
	fmt.Println(m)
	if k < m {
		fmt.Println(brotherWords[k-1])
	}
}

思路: 首先将输入的n个单词存储到一个列表中。

  • 遍历列表,对每个单词进行判断是否为x的兄弟单词。
  • 如果是兄弟单词,则将其添加到一个新的列表中。
  • 对新的列表进行排序,得到按字典序排列的兄弟单词列表。
  • 输出兄弟单词的个数m。
  • 如果k小于等于兄弟单词的个数m,则输出按字典序排序后的第k个兄弟单词。
  • 如果k大于兄弟单词的个数m,则不输出。
  • 题目要求我们找到给定单词 x 的兄弟单词中按字典序排列的第 k 个单词。

    首先,我们需要定义一个函数来判断两个单词是否是兄弟单词。可以通过比较两单词的字符排序后是否相等来实现。

    接下来,我们可以使用一个数组或者集合来存所有满足条件的兄弟单词遍历给定的词列表,对于每个单词,如果它不等于 x 并且与 x 是兄弟单词,则将其添加数组或集合中。

    最后,对存储兄弟单词的数组或集合进行排序,并输出第 k 单词。

    以下是一个可能的 Go 语言实现:

    package main
    
    import (
    	"fmt"
    	"sort"
    )
    
    // 判断两个词是否是兄弟单词
    func isBrotherWord(word1, word2 string) bool {
    	if word1 == word2 {
    		return false
    	}
    
    	sorted1 := sortString(word1)
    	sorted2 := sortString(word2)
    
    	return sorted1 == sorted2
    }
    
    // 对字符串进行排序
    func sortString(s string) string {
    	runes := []rune(s)
    	sort.Slice(runes, func(i, j int) bool {
    		return runes[i] < runes[j]
    	})
    	return string(runes)
    }
    
    func main() {
    	var n int
    	fmt.Scan(&n)
    
    	words := make([]string, n)
    	for i := 0; i < n; i++ {
    		fmt.Scan(&words[i])
    	}
    
    	var x string
    	fmt.Scan(&x)
    
    	var k int
    	fmt.Scan(&k)
    
    	brotherWords := make([]string, 0)
    	for _, word := range words {
    		if isBrotherWord(word, x) {
    			brotherWords = append(brotherWords, word)
    		}
    	}
    
    	sort.Strings(brotherWords)
    
    	m := len(brotherWords)
    	fmt.Println(m)
    
    	if k <= m {
    		fmt.Println(brotherWords[k-1])
    	}
    }
    
    

    这个实现中我们首先定义了 isBrotherWord 函数来判断两个单词是否是兄弟单词。然后,我们使用 sortString 函数对字符串进行排序。

    main 函数中,我们首先读取输入的 n、单词列表和 x。然后,我们遍历单词列表,找到所有满足条件的兄弟单词,并它们存储在 brotherWords 数组中。接下来,我们对 brotherWords 进行排序,并输出兄单词的个数 m。最后,如果 k 小于等于 m,则输出按字典序排列后的第 k 个兄弟单词。

    注意:以上代码仅为示,可能需要根据具的输入输出格式进行调整。

    全部评论

    相关推荐

    不愿透露姓名的神秘牛友
    昨天 12:04
    毕业生招你惹你了,问一个发薪日来一句别看网上乱七八糟的你看哪个工作没有固定发薪日扭头就取消了面试就问了一句公司都是这个态度吗还搞上人身攻击了...
    程序员小白条:呃呃呃,都还没面试,我都不会问这么细,何况通不通过,去不去都另说,你没实力和学历的话,在外面就这样,说实话没直接已读不回就不错了,浪费时间基本上
    点赞 评论 收藏
    分享
    测试糕手手:社会第一课,随便吹牛逼,直接说四个月,别老实。老实人只会被欺负
    点赞 评论 收藏
    分享
    06-07 17:17
    嘉兴学院 教师
    心爱的idea:你孩
    点赞 评论 收藏
    分享
    评论
    点赞
    收藏
    分享

    创作者周榜

    更多
    牛客网
    牛客网在线编程
    牛客网题解
    牛客企业服务