【华为OD机试真题】分界线(java&python)

分界线

时间限制:1s空间限制:32MB限定语言:不限

题目描述:

电视剧《分界线》里面有一个片段,男主为了向警察透露案件细节,且不暴露自己, 于是将报刊上的字剪切下来,剪拼成匿名信。现在有一名举报人,希望借鉴这种手段,使用英文报刊完成举报操作。但为了增加文章的混淆度,只需满足每个单词中字母数量一致即可,不关注每个字母 的顺序。解释:单词’on’允许通过单词’no’进行替代
报纸代表newspaper,匿名信代表anonymousLetter,求报纸内容是否可以拼成匿 名信。

输入描述:

第一行输入newspaper内容,包括1-N个字符串,用空格分开
第二行输入anonymousLetter内容,包括1-N个字符串,用空格分开
1、newspaper和anonymousLetter的字符串由小写英文字母组成且每个字母只能 使用一次
2、newspaper内容中的每个字符串字母顺序可以任意调整,但必须保证字符串的完 整性(每个字符串不能有多余字母)
3. 1

输出描述:

如果报纸可以拼成匿名信返回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循环就能搞定,匹配字符的方法也有很多。博主使用的是字符排序匹配法,大家也可以使用其他方法。

java代码:

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

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;
    }
}

python代码:

# -*- coding = utf-8 -*-
# @Time: 2023/4/11 
# @Author : MR 
# @File : boundary.py
# @Software : PyCharm

import sys

def handle(news, anony):
    newsChar = sorted(news)
    anonyChar = sorted(anony)
    return newsChar == anonyChar

newspaper = input().split()
anonymousLetter = input().split()
res = True
for anony in anonymousLetter:
    for i in range(len(newspaper)):
        news = newspaper[i]
        if len(anony) == len(news) and handle(news, anony):
            newspaper[i] = " "
            break
        if i == len(newspaper) - 1:
            res = False
    if not res:
        break

print(str(res).lower())

你可能感兴趣的:(java,开发语言,python,算法,华为)