day45—编程题

文章讲述了两个编程问题:一是如何判断一个盒子(A)是否包含另一个盒子(B)所有类型的乒乓球且数量不少于B;二是找到给定单词(x)的字典序第k个兄弟单词。解决方案包括使用哈希映射统计字符出现次数,以及对单词排序后进行比较。
摘要由CSDN通过智能技术生成

1.第一题

1.1题目

描述:
nowcoder有两盒(A、B)乒乓球,有红双喜的、有亚力亚的……现在他需要判别A盒是否包含了B盒中所有的种类,并且每种球的数量不少于B盒中的数量,该怎么办呢?
输入描述:
输入有多组数据。
每组数据包含两个字符串A、B,代表A盒与B盒中的乒乓球,每个乒乓球用一个大写字母表示,即相同类型的乒乓球为相同的大写字母。
字符串长度不大于10000
输出描述:
每一组输入对应一行输出:如果B盒中所有球的类型在A中都有,并且每种球的数量都不大于A,则输出“Yes”;否则输出“No”

1.2思路

  1. 分别统计AB中各个字符出现的次数,保存在hashmap中
  2. 遍历B查看各个字符出现的次数有没有超过A

1.3解题

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String A = sc.next();
            String B = sc.next();
            char[] chA = A.toCharArray();
            char[] chB = B.toCharArray();
            HashMap<Character, Integer> mapA = new HashMap<>();
            HashMap<Character, Integer> mapB = new HashMap<>();
            // 统计A中各个字符出现的次数,保存在hashmap中
            for (char ch : chA) {
                if (!mapA.containsKey(ch)) {
                    mapA.put(ch, 1);
                } else {
                    mapA.put(ch, mapA.get(ch) + 1);
                }
            }
            // 统计B中各个字符出现的次数,保存在hashmap中
            for (char ch : chB) {
                if (!mapB.containsKey(ch)) {
                    mapB.put(ch, 1);
                } else {
                    mapB.put(ch, mapB.get(ch) + 1);
                }
            }
            boolean flg = true;
            // 遍历B查看各个字符出现的次数有没有超过A
            for (char ch : chB) {
                if (!mapA.containsKey(ch) || mapA.get(ch) < mapB.get(ch)) {
                    flg = false;
                    break;
                }
            }
            if (flg) {
                System.out.println("Yes");
            } else {
                System.out.println("No");
            }
        }
    }
}

2.第二题

2.1题目

描述:
定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。
兄弟单词要求和原来的单词不同。例如: ab 和 ba 是兄弟单词。 ab 和 ab 则不是兄弟单词。
现在给定你 n 个单词,另外再给你一个单词 x ,让你寻找 x 的兄弟单词里,按字典序排列后的第 k 个单词是什么?
注意:字典中可能有重复单词
输入描述:
输入只有一行。
先输入字典中单词的个数n,再输入n个单词作为字典单词。
然后输入一个单词x
最后后输入一个整数k

2.2思路

  1. 将每个单词进行排序后判断是不是兄弟单词
  2. 将单词排序后统计兄弟单词出现的次数并记录下第k个出现的单词

2.3解题

import java.util.*;
public class Main {
    // 判断两个单词是不是兄弟单词
    public static boolean isBrother(String str1,String str2){
        // 兄弟单词要求和原来的单词不同
        if(str1.equals(str2)){
            return false;
        }
        char[] ch1 = str1.toCharArray();
        char[] ch2 = str2.toCharArray();
        Arrays.sort(ch1);
        Arrays.sort(ch2);
        str1 = new String(ch1);
        str2 = new String(ch2);
        return str1.equals(str2);
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String[] str = new String[n];
        for(int i = 0;i < n;i++){
            str[i] = sc.next();
        }
        // 要求的第K个单词是排序后的单词
        Arrays.sort(str);
        String x = sc.next();
        int k = sc.nextInt();
        int count = 0;
        // 保存第k个单词
        String ret = "";
        for(int i = 0;i < n;i++){
            // 统计兄弟单词出现的次数
            if(isBrother(str[i],x)){
                count++;
                if(count == k){
                    ret = str[i];
                }
            }
        }
        System.out.println(count);
        System.out.println(ret);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值