笔试强训day32

一、选择题

1、处于运行状态的操作系统程序应放在()
A 寄存器中
B 主存中
C 辅存中
他的回答: A (错误)
正确答案: B
A容量有限,只是加载cpu执行代码行需要的数据(从主存加载到寄存器)
B进程挂起状态,进程就会保存在辅存中
2、在系统内存中设置磁盘缓冲区的主要目的是()。
A 减少磁盘 I/O 次数
B 减少平均寻道时间
C 提高磁盘数据可靠性
D 实现设备无关性
他的回答: A (正确)
正确答案: A
磁盘磁盘缓冲区
cpu执行速度 比 磁盘io速度 要快很多
为了提高效率,经常访问的磁盘数据,可以使用磁盘缓存来提高io速度。
3、下列选项中,会导致进程从执行态变为就绪态的事件是()。
A 执行 P(wait)操作
B 申请内存失败
C 启动 I/O 设备
D 被高优先级进程抢占
他的回答: D (正确)
正确答案: D
A、B、C进入阻塞态。进程通信其中一种方式,信号量:p(wait)信号量-1,v(signal)信号量+1。
4、下面哪一种表述不属于操作系统的主要功能?()
A 处理机管理
B 存储器管理
C 设备管理和文件管理
D 可移植
他的回答: D (正确)
正确答案: D
5、在现代操作系统中采用缓冲技术的主要目的是()。
A 改善用户编程环境
B 提高CPU的处理速度
C 提高CPU和设备之间的并行程度
D 实现与设备无关性
他的回答: C (正确)
正确答案: C
在这里插入图片描述

6、进程和程序的一个本质区别是()。
A 前者为动态的,后者为静态的
B 前者存储在内存,后者存储在外存
C 前者在一个文件中,后者在多个文件中
D 前者分时使用CPU,后者独占CPU
他的回答: A (正确)
正确答案: A
7、一个进程的读磁区操作完成后,操作系统针对该进程必做的是 ()
A 修改进程状态为就绪态
B 降低进程优先级
C .进程分配用户内存空间
D 增加进程的时间片大小
他的回答: C (错误)
正确答案:A
8、选择在最近的过去很久未访问的页面予以淘汰的算法称为()。
A Opt.
B LRU
C MFU
D LFU
他的回答: D (错误)
正确答案:B
OPT (Optimal page replacement algorithm)
最佳页面替换算法,预测哪个页面最晚出现,就替换哪个页面。
LRU(Least Recently Used)
最近最少使用页面置换算法,也就是首先淘汰最长时间未被使用的页面。
MFU(Most Frequently Used)
最常使用算法,替换最常使用的页面
LFU(Least Frequently Used)
最近最不常用页面置换算法,淘汰一定时期内被访问次数最少的页面。
9、并发进程之间()。
A 彼此无关
B 必须同步
C 必须互斥
D 可能需要同步或互斥
他的回答: D (正确)
正确答案: D
互斥
是指散步在不同任务之间的若干程序片断,当某个任务运行其中一个程序片段时,其它任务就不能运行它们之中的任一程序片段,只能等到该任务运行完这个程序片段后才可以运行。最基本的场景就是:一个公共资源同一时刻只能被一个进程或线程使用,多个进程或线程不能同时使用公共资源。

同步
是指散步在不同任务之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖干要完成的特定的任务。最基本的场景就是:两个或两个以上的进程或线程在运行过程中协同步调,按预定
的先后次序运行。比如A任务的运行依赖于B任务产生的数据。
显然,同步是一种更为复杂的互斥,而互斥是一种特殊的同步。
10、一次I/O操作的结束,有可能导致()。
A 一个进程由睡眠变就绪
B 几个进程由睡眠变就绪
C 一个进程由睡眠变运行
D 几个进程由睡眠变运行
他的回答: B (错误)
正确答案: A

二、编程题

【淘宝网店】
NowCoder在淘宝上开了一家网店。他发现在月份为素数的时候,当月每天能赚1元;否则每天能赚2元。
现在给你一段时间区间,请你帮他计算总收益有多少。
输入描述:
输入包含多组数据。
每组数据包含两个日期from和to (2000-01-01 ≤ from ≤ to ≤ 2999-12-31)。
日期用三个正整数表示,用空格隔开:year month day。

输出描述:
对应每一组数据,输出在给定的日期范围(包含开始和结束日期)内能赚多少钱。

示例1:
输入
2000 1 1 2000 1 31\n2000 2 1 2000 2 29
输出
62\n29

【解题思路】:
既然是一个变相的日期计算器,那就写一个日期计算器,然后加以修改即可。那么,日期计算器怎么写呢?
日期计算器的话,我们将会把日期计算分为三个部分:第一个不足一年的年份,最后一个不足一年的年份,和中间的足年年份。足年年份我们只需要判断闰年后加365或366就行了。不足年,我们就要求出这个日期是这一年的第
几天。假设要求的是1994年5月27日到2003年4月29日,那么,我们就要先求出5月27日是这一年的第几天,然后判断1994年不是闰年,不是,所以用365减去这个天数,就得到结果了。本题中第一天也要算,所以还要加上这一天。然后再算出4月29日是2003年的第几天,就可以解决问题了。所以,我们需要一个函数,功能是给出一个年月日,求出这是这一年的第几天。
这些功能全部实现后,再去改造使得1、4、6、8、9、10、12月的天数翻倍,那么程序就全部完成了。

牛客网ACM模式代码

import java.util.*;
public class Main {
    private static boolean isLeapYear(int year) {
        return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
    }
    private static int profitOfYear(int year) {
        return 2 * 31
               + 1 * 28
               + 1 * 31
                + 2 * 30
                + 1 * 31
                + 2 * 30
                + 1 * 31
                + 2 * 31
                + 2 * 30
                + 2 * 31
                + 1 * 30
                + 2 * 31
                + (isLeapYear(year) ? 1 : 0);
    }
    private static boolean isPrime(int month) {
        return month == 2 || month == 3 || month == 5 || month == 7 || month == 11;
    }
    private static int profitOfThisYear(int year, int month, int day) {
        int profit = 0;
        if (!isPrime(month)) {
            profit = day * 2;
        } else {
            profit = day;
        }
        while (--month > 0) {
            switch (month) {
            case 1: case 8: case 10: case 12:
            profit += 62;
            break;
            case 3: case 5: case 7:
            profit += 31;
            break;
            case 4: case 6: case 9:
            profit += 60;
            break;
            case 11:
            profit += 30;
            break;
            default: // case 2
            profit += (28 + (isLeapYear(year) ? 1 : 0));
            break;
            }
        }
    return profit;
    }
    public static void main(String[] args) {
        int year1, month1, day1, year2, month2, day2;
        int profit = 0;
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            year1 = scanner.nextInt();
            month1 = scanner.nextInt();
            day1 = scanner.nextInt();
            year2 = scanner.nextInt();
            month2 = scanner.nextInt();
            day2 = scanner.nextInt();
            profit = profitOfYear(year1) - profitOfThisYear(year1, month1, day1 - 1);
            profit += profitOfThisYear(year2, month2, day2);
            if (year1 == year2) {
                profit -= profitOfYear(year1);
            }
            for (int i = year1 + 1; i < year2; i++) {
                profit += profitOfYear(i);
            }
        System.out.println(profit);
        }
    }
}

【斐波那契凤尾】
NowCoder号称自己已经记住了1-100000之间所有的斐波那契数。
为了考验他,我们随便出一个数n,让他说出第n个斐波那契数。当然,斐波那契数会很大。因此,如果第n个斐波那契数不到6位,则说出该数;否则只说出最后6位。
输入描述:
输入有多组数据。
每组数据一行,包含一个整数n (1≤n≤100000)。

输出描述:
对应每一组输入,输出第n个斐波那契数的最后6位。

示例1:
输入
1
2
3
4
100000
输出
1
2
3
5
537501

【解题思路】:
先求斐波那契数列在100000以内的每一项的后六位,然后需要的时候直接输出数组里的对应值即可。

牛客网ACM模式代码

import java.util.*;
public class Main {
    public static void main(String[] args) {
        int border = -1;
        long[] ans = new long[100000];
        ans[0] = 1;
        ans[1] = 2;
        for (int i = 2; i < 100000; i++) {
            long next = ans[i - 1] + ans[i - 2];
            if (border == -1 && next >= 1000000) {
                border = i + 1;
            }
            ans[i] = next % 1000000;
        }
        Scanner s = new Scanner(System.in);
        while (s.hasNextInt()) {
            int n = s.nextInt();
            long f = ans[n - 1];
            if (n < border) {
                System.out.printf("%d\n", f);
            } else {
                System.out.printf("%06d\n", f);
            }
        }
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值