
✅创作者:陈书予
 🎉个人主页:陈书予的个人主页
 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
 🌟专栏地址: Java华为OD机试真题(2022&2023) 
文章目录
- 1. 题目描述
- 2. 输入描述
- 3. 输出描述
- 4. Java算法源码
- 5. 测试
- 6.解题思路
 
1. 题目描述
给定一个可存储若干单词的字典,找出指定单词的所有相似单词,并且按照单词名称从小到大排序输出。
单词仅包括字母,但可能大小写并存(大写不一定只出现在首字母)。
相似单词说明:
 给定一个单词X,如果通过任意交换单词中字母的位置得到不同的单词Y,那么定义Y是X的相似单词,如abc、bca即为相似单词(大小写是不同的字母,如a和A算两个不同字母)。
字典序排序: 大写字母<小写字母。同样大小写的字母,遵循26字母顺序大小关系。即A<B<C<…<X<Y<Z<a<b<c<…<x<y<z。
如Bac<aBc<acB<cBa。
2. 输入描述
第一行为给定的单词个数N(N为非负整数);
 从第二行到第N+1行是具体的单词(每行一个单词);
 最后一行是指定的待检测单词(用于检测上面给定的单词中哪些是与该指定单词是相似单词,该单词可以不是上面给定的单词)
3. 输出描述
从给定的单词组中,找出指定单词的相似单词,并且按照从小到大字典序排列输出,中间以空格隔开;
 如果不存在,则输出null(字符串null)。
4. Java算法源码
 public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        String[] words = new String[n];
        for (int i = 0; i < n; i++) {
            words[i] = scanner.next();
        }
        String targetWord = scanner.next();
        List<String> similarWords = findSimilarWords(words, targetWord);
        if (similarWords.isEmpty()) {
            System.out.println("null");
        } else {
            Collections.sort(similarWords);
            System.out.println(String.join(" ", similarWords));
        }
    }
    private static List<String> findSimilarWords(String[] words, String targetWord) {
        List<String> similarWords = new ArrayList<>();
        for (String word : words) {
            if (isSimilar(word, targetWord)) {
                similarWords.add(word);
            }
        }
        return similarWords;
    }
    private static boolean isSimilar(String word1, String word2) {
        if (word1.length() != word2.length()) {
            return false;
        }
        int[] count1 = new int[26];
        int[] count2 = new int[26];
        for (int i = 0; i < word1.length(); i++) {
            char c1 = word1.charAt(i);
            char c2 = word2.charAt(i);
            if (c1 >= 'A' && c1 <= 'Z') {
                count1[c1 - 'A']++;
            } else {
                count1[c1 - 'a']++;
            }
            if (c2 >= 'A' && c2 <= 'Z') {
                count2[c2 - 'A']++;
            } else {
                count2[c2 - 'a']++;
            }
        }
        for (int i = 0; i < 26; i++) {
            if (count1[i] != count2[i]) {
                return false;
            }
        }
        return true;
    }
5. 测试

6.解题思路

- 读取输入的单词个数 N。
- 创建一个长度为 N的字符串数组words,并读取输入的单词。
- 读取输入的待检测单词 targetWord。
- 创建一个空的字符串列表 similarWords用于存储相似单词。
- 调用 findSimilarWords方法,传入单词数组words和待检测单词targetWord,获取相似单词列表similarWords。
- 如果 similarWords列表为空,输出字符串 “null”。
- 否则,对 similarWords列表进行字典序排序。
- 使用字符串连接方法将 similarWords列表中的相似单词按空格连接成一个字符串,并输出。
  
![[已解决] 决定系数R2为何为负 from sklearn.metrics import r2_score](https://img-blog.csdnimg.cn/14a86e054d2d4f65bf377e1238b482a1.png)


















