Loading...
百度&必应权4, 日IP1w+ 查看详情
自助收录

2023年华为OD机考真题:寻找相似单词

算法刷题2年前 (2023)更新 江南白衣
454 0 0
2023年华为OD机考真题:寻找相似单词

全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。

真题库:https://www.yuque.com/codernav.com/od

题目:寻找相似单词
知识点字符串排序
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
给定一个可存储若干单词的字典,找出指定单词的所有相似单词,并且按照单词名称从小到大排序输出。单词仅包括字母,但可能大小写并存(大写不一定只出现在首字母)。
相似单词说明:给定一个单词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.
输入描述:
第一行为给定的单词个数N(N为非负整数)
从第二行到地N+1行是具体的单词(每行一个单词)
最后一行是指定的待检测单词(用于检测上面给定的单词中哪些是与该指定单词是相似单词,该单词可以不是上面给定的单词)
输出描述:
从给定的单词组中,找出指定单词的相似单词,并且按照从小到大字典序排列输出,中间以空格隔开
如果不存在,则输出null(字符串null)
示例1
输入:
4
abc
dasd
tad
bca
abc
输出:
abc bca
说明:
在给定的输入中,与abc是兄弟单词的是abc bca,且输出按照字典序大小排序,输出的所有单词以空格隔开
示例2
输入:
4
abc
dasd
tad
bca
abd
输出:
null
说明:
给定单词组中,没有与给定单词abd是兄弟单词,输出为null(字符串null)
解题思路:
判断两个字符串是否相似的方法:
将两个字符串转换为字符数组,排序后比较各位置的字符是否都相同,如若都相同则相似,只要有一个不相同则不相似。

代码实现一:

package com.codernav.demo.hwod.exam;

import java.util.*;

/**
 * @title 寻找相似单词
 * @Description 给定一个可存储若干单词的字典,找出指定单词的所有相似单词,并且按照单词名称从小到大排序输出。
 * 单词仅包括字母,但可能大小写并存(大写不一定只出现在首字母)。
 * 相似单词说明:给定一个单词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.
 * @Author 开发者导航
 * @website https://codernav.com
 * @date 2023/5/28
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        sc.nextLine();
        List<String> list = new ArrayList<>();
        for (int i = 0; i < N; i++) {
            list.add(sc.nextLine());
        }
        String X = sc.nextLine();
        Collections.sort(list);
        String res = "";
        for (String Y : list) {
            if (Y.length() == X.length() && isSimilar(X, Y)) {   //长度相同才能相似
                res += Y + " ";
            }
        }
        System.out.println(res.length() == 0 ? "null" : res.substring(0, res.length() - 1));
    }

    /**
     * 将两个字符串转换为字符数组
     * 排序后比较字符是否都相同
     * 都相同则相似
     * 有一个不相同则不相似
     *
     * @param X
     * @param Y
     * @return
     */
    public static boolean isSimilar(String X, String Y) {
        char[] charX = X.toCharArray();
        char[] charY = Y.toCharArray();

        Arrays.sort(charX);
        Arrays.sort(charY);

        boolean res = true;
        for (int i = 0; i < charX.length; i++) {
            if (charX[i] != charY[i]) {   //有一个字符不相同就不相似
                res = false;
                break;
            }
        }
        return res;
    }
}

代码实现二:Java代码满分实现

package com.codernav.demo.hwod.exam;

import java.util.Arrays;
import java.util.Scanner;
import java.util.TreeSet;

/**
 * @title 寻找相似单词
 * @Description 给定一个可存储若干单词的字典,找出指定单词的所有相似单词,并且按照单词名称从小到大排序输出。
 * 单词仅包括字母,但可能大小写并存(大写不一定只出现在首字母)。
 * 相似单词说明:给定一个单词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.
 * @Author 开发者导航
 * @website https://codernav.com
 * @date 2023/5/28
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        String[] str = new String[n];
        String s;
        for (int i = 0; i < n; i++) {
            str[i] = in.next();
        }
        s = in.next();

        TreeSet<String> set = new TreeSet<>();
        for (String value : str) {
            if (isXiangShi(s, value)) {
                set.add(value);
            }
        }

        if (set.size() == 0) {
            System.out.println("null");
        } else {
            for (String c : set) {
                System.out.print(c + " ");
            }
        }
    }

    public static boolean isXiangShi(String a, String b) {
        if (a.length() != b.length()) {
            return false;
        }
        char[] s1 = a.toCharArray();
        char[] s2 = b.toCharArray();
        Arrays.sort(s1);
        Arrays.sort(s2);
        for (int i = 0; i < s1.length; i++) {
            if (s1[i] != s2[i]) {
                return false;
            }
        }
        return true;
    }
}

 

© 版权声明

相关文章

暂无评论

暂无评论...