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

目录

一、编程题

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

75b319aa432141098b6f7edf05276867.png  

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

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️⃣获取第二行中的名字,检测该名字是否存在,并按照题目的要求进行输出

3ac03007e44749e4afcb8757ec79624c.png

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 辅存就绪

c2721d2bda21429c8a9458e43d2b9ac3.png

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

A 仅Ⅰ

B 仅Ⅱ

C 仅Ⅲ

D 仅Ⅰ, Ⅱ

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

 

 

 

  • 106
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 96
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 96
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗小温

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值