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

2023年华为OD机考真题:分界线

算法刷题2年前 (2023)更新 江南白衣
465 0 0
2023年华为OD机考真题:分界线

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

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

题目:分界线
时间限制:1s 空间限制:32MB 限定语言:不限
题目描述:
电视剧《分界线》里面有一个片段,男主为了向警察透露案件细节,且不暴露自己,于是将报刊上的字剪切下来,剪拼成匿名信。
现在有一名举报人,希望借鉴这种手段,使用英文报刊完成举报操作。
但为了增加文章的混淆度,只需满足每个单词中字母数量一致即可,不关注每个字母的顺序。
解释:单词’on’允许通过单词’no’进行替代
报纸代表newspaper, 匿名信代表anonymousLetter, 求报纸内容是否可以拼成匿名信。
输入描述:
第一行输入newspaper内容,包括1-N个字符串,用空格分开
第二行输入anonymousLetter内容,包括1-N个字符串,用空格分开
1、newspaper和anonymousLetter的字符串由小写英文字母组成且每个字母只能使用一次
2、newspaper内容中的每个字符串字母顺序可以任意调整,但必须保证字符串的完整性(每个字符串不能有多余字母)
3、1<N<100 , 1<= newspaper.length, anonymousLetter.length <= 104
输出描述:
如果报纸可以拼成匿名信返回ture,否则返回false
示例1
输入:
ab cd
ab
输出:
true
示例2
输入:
ab ef
aef
输出:
false
示例3
输入:
ab bcd ef
cbd fe
输出:
true
示例4
输入:
ab bcd ef
cd ef
输出:
false
解题思路:
题目的意思就是希望匿名信中的所有字符串都能在报纸上找到对应的字符串(字符顺序可以不相同,但是字符一点要全匹配);且报纸上已匹配的字符串,就不能再匹配其他字符串了。
题目比较简单,双层for循环就能搞定,匹配字符的方法也有很多。
博主使用的是字符排序匹配法,大家也可以使用其他方法。

代码实现一:

package com.codernav.demo.hwod.exam;

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

/**
 * @title 分界线
 * @Description 电视剧《分界线》里面有一个片段,男主为了向警察透露案件细节,且不暴露自己,于是将报刊上的字剪切下来,剪拼成匿名信。
 * 现在有一名举报人,希望借鉴这种手段,使用英文报刊完成举报操作。
 * 但为了增加文章的混淆度,只需满足每个单词中字母数量一致即可,不关注每个字母的顺序。
 * @Author 开发者导航
 * @website https://codernav.com
 * @date 2023/5/13
 */
public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        String[] newspaper = sc.nextLine().split(" ");
        String[] anonymousLetter = sc.nextLine().split(" ");

        boolean res = true;
        for (String anony : anonymousLetter) {
            for (int i = 0; i < newspaper.length; i++) {
                String news = newspaper[i];
                if (anony.length() == news.length() && handle(news, anony)) {    //长度相等才有资格匹配
                    newspaper[i] = " ";     //使用过的字符串之后就不能使用了
                    break;
                }
                if (i == newspaper.length - 1) {    //遍历到最后都没有匹配的,直接false
                    res = false;
                }
            }
            if (!res) {   //已经失败了,跳出循环
                break;
            }
        }

        System.out.println(res);
    }

    /**
     * 通过char字符的排序,然后判断是否一一匹配,只要一个不匹配,直接false
     *
     * @param news  报纸上的字符串
     * @param anony 匿名信上的字符串
     * @return
     */
    public static boolean handle(String news, String anony) {

        char[] newsChar = news.toCharArray();
        char[] anonyChar = anony.toCharArray();
        Arrays.sort(newsChar);
        Arrays.sort(anonyChar);

        boolean isTrue = true;
        for (int i = 0; i < newsChar.length; i++) {
            if (newsChar[i] != anonyChar[i]) {
                isTrue = false;
            }
        }

        return isTrue;
    }
}

代码实现二:满分,有点缺陷

package com.codernav.demo.hwod.exam;

import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

/**
 * @title 分界线
 * @Description 电视剧《分界线》里面有一个片段,男主为了向警察透露案件细节,且不暴露自己,于是将报刊上的字剪切下来,剪拼成匿名信。
 * 现在有一名举报人,希望借鉴这种手段,使用英文报刊完成举报操作。
 * 但为了增加文章的混淆度,只需满足每个单词中字母数量一致即可,不关注每个字母的顺序。
 * @Author 开发者导航
 * @website https://codernav.com
 * @date 2023/5/13
 */
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String paperStr = in.nextLine();
        String aymStr = in.nextLine();
        if (paperStr == null || paperStr.length() == 0) {
            System.out.println(false);
            return;
        }
        List<String> paperList = Arrays.asList(paperStr.split(" "));
        List<String> aymList = Arrays.asList(aymStr.split(" "));


        for (String aym : aymList) {
            boolean flag = false;
            for (String paper : paperList) {
                if (strEqual(aym, paper)) {
                    flag = true;
                    break;
                }
            }
            if (!flag) {
                System.out.println(false);
                return;
            }
        }
        System.out.println(true);
    }

    public static boolean strEqual(String str1, String str2) {
        if (str1 == null || str2 == null) {
            return false;
        }
        char[] str1Char = str1.toCharArray();
        char[] str2Char = str2.toCharArray();
        int sum1 = 0;
        int sum2 = 0;
        for (char c : str1Char) {
            sum1 += c;
        }
        for (char c : str2Char) {
            sum2 += c;
        }

        return sum1 == sum2;
    }
}

代码实现三:满分解法

package com.codernav.demo.hwod.exam;

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

/**
 * @title 分界线
 * @Description 电视剧《分界线》里面有一个片段,男主为了向警察透露案件细节,且不暴露自己,于是将报刊上的字剪切下来,剪拼成匿名信。
 * 现在有一名举报人,希望借鉴这种手段,使用英文报刊完成举报操作。
 * 但为了增加文章的混淆度,只需满足每个单词中字母数量一致即可,不关注每个字母的顺序。
 * @Author 开发者导航
 * @website https://codernav.com
 * @date 2023/5/13
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String newsapper = sc.nextLine();
        String anonymousLetter = sc.nextLine();
        String[] newsapperArr = newsapper.split(" ");
        String[] anonymousLetterArr = anonymousLetter.split(" ");
        for (int i = 0; i < anonymousLetterArr.length; i++) {
            String ii = anonymousLetterArr[i];
            char[] ic = ii.toCharArray();
            Arrays.sort(ic);
            boolean flag = false;
            for (int j = 0; j < newsapperArr.length; j++) {
                String jj = newsapperArr[j];
                char[] jc = jj.toCharArray();
                Arrays.sort(jc);
                if (Arrays.equals(ic, jc)) {
                    flag = true;
                    break;
                }
            }
            if (!flag) {
                System.out.println(false);
                System.exit(0);
            }
        }
        System.out.println(true);
    }
}
© 版权声明

相关文章

暂无评论

暂无评论...