目录
一、编程题
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的阶乘,然后两者一除,就是概率了。
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️⃣获取第二行中的名字,检测该名字是否存在,并按照题目的要求进行输出
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,撤销部分进程可以减少所要用到的页面数,防止抖动。
Ⅱ和Ⅲ,对换区大小和进程优先级都与抖动无关。