错排问题之年会抽奖与抄送列表

news/2024/6/18 21:11:30 标签: 算法, 开发语言, java

目录

一、编程题

1.年会抽奖

2.抄送列表

二、选择题

1.操作系统中关于竞争和死锁的关系下面描述正确的是?

2.并发是并行的不同表述,其原理相同。

3.在Unix系统中,处于()状态的进程最容易被执行。

 4.当系统发生抖动(thrashing)时,可以采取的有效措施是( )。Ⅰ.撤销部分进程 Ⅱ.增加磁盘交换区的容量 Ⅲ.提高用户进程的优先级


一、编程题

1.年会抽奖

链接:年会抽奖__牛客网 (nowcoder.com)

今年公司年会的奖品特别给力,但获奖的规矩却很奇葩:
1. 首先,所有人员都将一张写有自己名字的字条放入抽奖箱中;
2. 待所有字条加入完毕,每人从箱中取一个字条;
3. 如果抽到的字条上写的就是自己的名字,那么“恭喜你,中奖了!”
现在告诉你参加晚会的人数,请你计算有多少概率会出现无人获奖?

输入描述:

输入包含多组数据,每组数据包含一个正整数n(2≤n≤20)。

输出描述:

对应每一组数据,以“xx.xx%”的格式输出发生无人获奖的概率。

示例1

输入

2

输出

50.00%

🔎思路分析:这是一个经典的错排问题

❓❓什么是错排呢

用A、B、C......表示写着n位友人名字的信封,a、b、c......表示n份相应的写好的信纸。把错装的总数记作D(n)。假设把a错装进B里,包含这个错误的一切错装法分两类:

1️⃣b装入A里:这个时候每种错装的其余部分都与A、B、a、b无关,应有D(n-2)种错装法

2️⃣b装入A、B之外的一个信封,这时的装信工作实际是把(除a之外的)n-1份信纸b、c.......装入(除B以外的)n-1个信封A、C......,显然这时装错的方法有D(n-1)

总之:

在a装入B的错误之下,共有错装法D(n-2) + D(n-1)种

a装入C,装入D......的n-2种错误之下,同样有D(n-1) + D(n-2)种错装法,因此D(n) = n-1[D(n-1) + D(n-2)]

特殊的D(1) = 0,D(2) = 1

  

错排的递推公式是:D(n) = (n - 1) [D(n - 2) + D(n - 1)],也就是第n项为n - 1倍的前两项和。通过这个递推公式可以 得到在总数为n的时候,错排的可能性一共有多少种。那么要求错排的概率,我们还需要另一个数值,就是当总数为n的时候,所有的排列组合一共有多少种,那么根据排列组合,肯定是使用公式来求,也就是n的阶乘。所以结果很简单,就是用公式求出第n项的错排种类,和n的阶乘,然后两者一除,就是概率了。

java">import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        long[] arr1 = new long[21]; //错排数组
        arr1[0] = arr1[1] = 0;
        arr1[2] = 1;
        long[] arr2 = new long[21]; //阶乘
        arr2[0] = arr2[1] = 1;//0的阶乘1;1的阶乘2;2的阶乘2
        arr2[2] = 2;
        for (int i = 3; i <= 20; i++) {
            arr1[i] = (i - 1) * (arr1[i - 1] + arr1[i - 2]);//错排的每一项
            arr2[i] = i * arr2[i - 1];//阶乘
        }
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            System.out.printf("%.2f%%\n", 100.0 * arr1[n] / arr2[n]);//100.0是用来转化为double
        }

    }
}

2.抄送列表

链接:抄送列表__牛客网 (nowcoder.com)

NowCoder每天要处理许多邮件,但他并不是在收件人列表中,有时候只是被抄送。他认为这些抄送的邮件重要性比自己在收件人列表里的邮件低,因此他要过滤掉这些次要的邮件,优先处理重要的邮件。
现在给你一串抄送列表,请你判断目标用户是否在抄送列表中。
输入描述:

输入有多组数据,每组数据有两行。

第一行抄送列表,姓名之间用一个逗号隔开。如果姓名中包含空格或逗号,则姓名包含在双引号里。总长度不超过512个字符。

第二行只包含一个姓名,是待查找的用户的名字(姓名要完全匹配)。长度不超过16个字符。

输出描述:

如果第二行的名字出现在收件人列表中,则输出“Ignore”,表示这封邮件不重要;否则,输出“Important!”,表示这封邮件需要被优先处理。

示例1

输入

Joe,Kewell,Leon

Joe

"Letendre, Bruce",Joe,"Quan, William"

William

输出

Ignore

Important!

🔎思路分析:

1️⃣通过Scanner的nextLine()方法获取第一行中的名字

2️⃣解析出第一行中的所有名字保存在HashSet中

3️⃣获取第二行中的名字,检测该名字是否存在,并按照题目的要求进行输出

java">import java.util.*;
public class Main{
    public static void main(String[] args){
        // 循环处理每组测试用例
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
        // 接收第一行的所有名字,并对名字进行分割,将分割好的名字放在Set
            String name = sc.nextLine();
            int i = 0;
            int end = 0;
            Set<String> s = new HashSet<>();
            while(i < name.length()){
                if('\"' == name.charAt(i)){
                    // 名字包含在""中
                    end = name.indexOf('\"', i + 1);
                    s.add(name.substring(i+1, end)); // 参数1:起始位置 参数2:表示末尾位置
                    //注意:该位置的字符不会被截取到,截取到该位置之前的字符
                            i = end + 2;
                }else{
                    // 名字没有包含在""中
                    end = name.indexOf(',', i+1);
                    if(-1 == end){
                        // 现在要分割的名字是最后一个名字
                        s.add(name.substring(i, name.length()));
                        break;
                    }
                    name.substring(i, end);
                    i = end + 1;
                }
            }
            // 获取第二行的名字并检测该名字是否在Set中存在
            name = sc.nextLine();
            if(s.contains(name)){
                System.out.println("Ignore");
            }else{
                System.out.println("Important!");
            }
        }
    }
}

二、选择题

1.操作系统中关于竞争和死锁的关系下面描述正确的是?

A、竞争一定会导致死锁

B、死锁一定由竞争引起

C、竞争可能引起死锁

D、预防死锁可以防止竞争

死锁的四个必要条件:
1️⃣互斥条件:一个资源每次只能被一个进程使用。
2️⃣请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3️⃣不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
4️⃣循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

2.并发是并行的不同表述,其原理相同。

A 错

B 对

并发:多个进程在一个CPU下采用时间片轮转的方式,在一段时间之内,让多个进程都得以推进,称之为并发。

并行:多个进程在多个CPU下分别,同时进行运行,这称之为并行。

3.在Unix系统中,处于()状态的进程最容易被执行。

A 辅存睡眠

B 内存睡眠

C 内存就绪

D 辅存就绪

 4.当系统发生抖动(thrashing)时,可以采取的有效措施是( )。Ⅰ.撤销部分进程 Ⅱ.增加磁盘交换区的容量 Ⅲ.提高用户进程的优先级

A 仅Ⅰ

B 仅Ⅱ

C 仅Ⅲ

D 仅Ⅰ, Ⅱ

在具有对换功能的操作系统中,通常把外存分为文件区对换区。前者用于存放文件,后者用于存放从内存换出的进程。
抖动现象是指刚刚被换出的页很快又要被访问。为此,又要换出其他页,而该页又快被访问,如此频繁地置换页面,以致大部分时间都花在页面置换上。
I,撤销部分进程可以减少所要用到的页面数,防止抖动。
Ⅱ和Ⅲ,对换区大小和进程优先级都与抖动无关。


http://www.niftyadmin.cn/n/304275.html

相关文章

HTTP 协议详解

HTTP 协议全称为 Hypertext Transfer Protocol&#xff0c;即超文本传输协议&#xff0c;是互联网上应用最为广泛的一种网络传输协议。HTTP 协议定义了客户端&#xff08;Browser&#xff09;与服务器之间的通信规范&#xff0c;以实现对各种资源&#xff08;如 HTML 页面、图像…

看板项目管理:如何可视化工作以提高生产力?

如果你一直关心优化工作流程&#xff0c;提高你或团队的生产力&#xff0c;你肯定听说过看板这个词。 看板是一种工作管理方法&#xff0c;可以将整个工作流程以及构成工作流程的每个单独活动可视化&#xff0c;从而可以识别瓶颈和优化整体流程。 在这方面&#xff0c;看板的…

车联网强势发展下,有什么隐患?

通过新一代信息通信技术&#xff0c;车联网实现了汽车与云平台&#xff0c;车辆和汽车&#xff0c;道路&#xff0c;汽车和人以及内部的全方位网络链接。车联网使用传感器技术感知车辆的状态信息&#xff0c;并利用无线通信网络和现代智能信息处理技术的帮助实现交通智能化管理…

【Linux】Keepalived+Haproxy实现数据库集群负载均衡

1、简介&#xff1a; 本文章的负载均衡和高可用是体现在两个从服务器上的。一般来说高可用是用在主服务器中的&#xff0c;例如双主多从的结构&#xff0c;双主做keepalived的高可用&#xff08;当然也可以加上haproxy做负载均衡&#xff09;&#xff0c;多从做haproxy的负载均…

MySQL之盛放记录的大盒子 【InnoDB 数据页结构】

前言 本文章收录在MySQL性能优化原理实战专栏&#xff0c;点击此处查看更多优质内容。 本文摘录自 ▪ 小孩子4919《MySQL是怎样运行的&#xff1a;从根儿上理解MySQL》 学完了记录结构&#xff0c;我们该学数据页的结构&#xff0c;前边我们简单的提了一下页的概念&#xff…

C语言头文件

头文件是C程序中用于包含函数、变量、类和其他程序元素的文件。以下是一些常见的头文件及其用途&#xff1a; 1. iostream&#xff1a;用于输入输出流操作&#xff0c;如cin和cout。 2. cmath&#xff1a;用于数学计算&#xff0c;如sin、cos、sqrt等。 3. cstdlib&#xff…

【细读Spring Boot源码】@ComponentScan是如何生效的?

前言 在使用SpringBoot使用过程中 RestController、Service、Repository这几个注解类上都标有Component注解 启动类上标有的SpringBootApplication注解类上有个ComponentScan注解。那么ComponentScan如何把相关的对象注册到BeanFactory的&#xff1f; 找到处理ComponentScan注…

【Java校招面试】基础知识(八)——Linux服务器

目录 前言一、基础概念二、常用命令后记 前言 本篇主要介绍Linux服务器的相关内容。 “基础知识”是本专栏的第一个部分&#xff0c;本篇博文是第八篇博文&#xff0c;如有需要&#xff0c;可&#xff1a; 点击这里&#xff0c;返回本专栏的索引文章点击这里&#xff0c;返回…