牛客刷题

简介: 牛客刷题

1、乒乓球框

乒乓球筐__牛客网 (nowcoder.com)

nowcoder有两盒(A、B)乒乓球,有红双喜的、有亚力亚的……现在他需要判别A盒是否包含了B盒中所有的种类,并且每种球的数量不少于B盒中的数量,该怎么办呢?

输入描述:

输入有多组数据。

每组数据包含两个字符串A、B,代表A盒与B盒中的乒乓球,每个乒乓球用一个大写字母表示,即相同类型的乒乓球为相同的大写字母。

字符串长度不大于10000。

输出描述:

每一组输入对应一行输出:如果B盒中所有球的类型在A中都有,并且每种球的数量都不大于A,则输出“Yes”;否则输出“No”。

示例1

输入

ABCDFYE CDE<br/>ABCDGEAS CDECDE

输出

Yes<br/>No

Ⅰ、思路

使用HashMap进行一个个判断B盒中的球在A盒中是否有,然后剔除A盒的球,直到遍历完B盒中的球,B盒中所有的球在A中都有,则输出 Yes 否则输出 No。

对HashMap不了解的同学可以看看这篇文章!

HashSet和HashMap_hashset foreach_冷兮雪的博客-CSDN博客

或者使用StringBufffer,也是和HashMap一样的写法

Ⅱ、代码

HashMap

import java.util.HashMap;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while (sc.hasNext()){//多组输入
            String s=sc.nextLine();
            String[] ss=s.split(" ");
            HashMap<Character,Integer> map1=new HashMap<>();//将A盒乒乓球放入HashMap中记录
            for (int i=0;i<ss[0].length();i++){
                map1.put(ss[0].charAt(i),map1.getOrDefault(ss[0].charAt(i),0)+1);
            }
            boolean b=true;//标识符,判断A盒的球是否满足条件,因为是多组输入,不能直接return
            for (int i=0;i<ss[1].length();i++){//遍历B盒乒乓球,查看A盒的球是否满足条件
                if (map1.containsKey(ss[1].charAt(i))){//查看是否有B盒中的球
                    if (map1.get(ss[1].charAt(i))==0) {//查看A盒中的球是否不为0
                        b=false;
                        System.out.println("No");
                        break;
                    }
                    else//A盒中有,则一个个剔除
                        map1.put(ss[1].charAt(i),map1.get(ss[1].charAt(i))-1);
                }else{
                    b=false;
                    System.out.println("No");
                    break;
                }
            }
            if (b)
                System.out.println("Yes");
        }
    }
}

StringBuffer

import java.util.Scanner;
public class Main
{
  public static void main(String[] args)
  {
    Scanner in = new Scanner(System.in);
    while (in.hasNext())
    {
      boolean contain = true;
      StringBuffer s = new StringBuffer(in.next());
      char[] find = in.next().toCharArray();
      for (char c : find)
      {
        int index = s.indexOf(String.valueOf(c));
        if (index != -1)
          s.deleteCharAt(index);
        else
        {
          System.out.println("No");
          contain = false;
          break;
        }
      }
      if (contain)
        System.out.println("Yes");
    }
  }
}

2、查找兄弟单词

查找兄弟单词_牛客题霸_牛客网 (nowcoder.com)

描述

定义一个单词的“兄弟单词”为:交换该单词字母顺序(注:可以交换任意次),而不添加、删除、修改原有的字母就能生成的单词。


兄弟单词要求和原来的单词不同。例如: ab 和 ba 是兄弟单词。 ab 和 ab 则不是兄弟单词。


现在给定你 n 个单词,另外再给你一个单词 x ,让你寻找 x 的兄弟单词里,按字典序排列后的第 k 个单词是什么?


注意:字典中可能有重复单词。


数据范围: 1≤n≤1000 ,输入的字符串长度满足  1≤len(str)≤10  ,  1≤k<n


输入描述:


输入只有一行。 先输入字典中单词的个数n,再输入n个单词作为字典单词。 然后输入一个单词x 最后后输入一个整数k


输出描述


第一行输出查找到x的兄弟单词的个数m 第二行输出查找到的按照字典顺序排序后的第k个兄弟单词,没有符合第k个的话则不用输出。


示例1

输入:

3 abc bca cab abc 1

输出:

 2
 bca

示例2

输入:

6 cab ad abcd cba abc bca abc 1

输出:

 3
 bca

说明:

abc的兄弟单词有cab cba bca,所以输出3

经字典序排列后,变为bca cab cba,所以第1个字典序兄弟单词为bca  

Ⅰ、思路

三步走

  1. 对n个单词升序排序
  2. 第n个单词和 x 相等 和 长度不一致的跳过
  3. 对第n个单词 和 x 的每个字符升序排序,并比较是否相等,如果相等则为兄弟单词。

Ⅱ、代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        String s = null;
        s = bf.readLine();
        // 将输入的字符串分割成字符串数组
        String[] words = s.split(" ");
        // 待查找单词
        String str = words[words.length - 2];
        // 兄弟单词表里的第k个兄弟单词
        int k = Integer.parseInt(words[words.length - 1]);
        // 存放兄弟单词表
        ArrayList<String> broWords = new ArrayList<>();
        // 遍历输入的单词
        for (int i = 1; i < words.length - 2; i++) {
            // 不相等且长度相同
            if ((!words[i].equals(str)) && words[i].length() == str.length()) {
                char[] chStr = str.toCharArray();
                char[] word = words[i].toCharArray();
                int temp = 0;
                for (int j = 0; j < chStr.length; j++) {
                    for (int j2 = 0; j2 < word.length; j2++) {
                        if (word[j] == chStr[j2]) {
                            chStr[j2] = '0';
                            temp++;
                            break;
                        }
                    }
                }
                // 相等且长度相同,则存放进broWords 
                if (temp == chStr.length) {
                    broWords.add(words[i]);
                }
            }
        }
        System.out.println(broWords.size());
        if (k > 0 && k <= broWords.size()) {
            Collections.sort(broWords);//按字典排序
            System.out.println(broWords.get(k - 1));
        }
    }
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        ArrayList<String> arr=new ArrayList<>();
        String[] s1=new String[n];
        for (int i=0;i<n;i++){
            s1[i]=sc.next();
        }
        String ss=sc.next();//单词x
        char[] ar1=ss.toCharArray();//转换成char数组,方便比较是否为兄弟单词
        Arrays.sort(ar1);
        int k=sc.nextInt();//第k个兄弟单词
        for (String s : s1) {//遍历s1数组 与ss单词不能相同且长度应该一样
            if (!s.equals(ss) && s.length() == ss.length()) {
                char[] ar2 = s.toCharArray();
                Arrays.sort(ar2);
                if (Arrays.toString(ar2).equals(Arrays.toString(ar1))) {//判断单词组成是否相同
                    arr.add(s);
                }
            }
        }
        Collections.sort(arr);//按字典顺序排序
        System.out.println(arr.size());
        if (arr.size()>k){
            System.out.println(arr.get(k-1));
        }
    }
}
目录
相关文章
|
JavaScript 前端开发 程序员
node.js这些常用命令,你都会了吗?
本文介绍了Node.js和npm的常用命令。在npm方面,包括安装、卸载、更新包,初始化项目,运行脚本等;在Node.js方面,涉及运行JavaScript文件、启用调试模式和查看版本信息等。掌握这些基础命令对于日常开发至关重要。
|
SQL Java 关系型数据库
MyCAT----读写分离
MyCAT 是一款用 Java 开发的开源数据库中间件,需在 JDK7 以上环境运行。它位于应用与数据库间,负责数据处理与交互,支持读写分离与分库分表。部署时需先安装 JDK,再下载解压 MyCAT,并配置 `server.xml` 和 `schema.xml` 文件定义用户、逻辑库及数据节点。启动 MyCAT 后,可通过 SQL 客户端验证读写分离策略。
|
存储 定位技术 数据处理
Python为Excel中每一个单元格计算其在多个文件中的平均值
Python为Excel中每一个单元格计算其在多个文件中的平均值
244 2
|
4天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
280 116
|
19天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
6天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
401 38
Meta SAM3开源:让图像分割,听懂你的话
|
13天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
669 220