每日一题 | day29 (有假币| 求正数数组的最小不可组成和)
Posted WhiteShirtI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题 | day29 (有假币| 求正数数组的最小不可组成和)相关的知识,希望对你有一定的参考价值。
选择题
1、X86体系结构在保护模式下中有三种地址,请问一下那种说法是正确的?
A 虚拟地址先经过分段机制映射到线性地址,然后线性地址通过分页机制映射到物理地址
B 线性地址先经过分段机制映射到虚拟地址,然后虚拟地址通过分页机制映射到物理地址
C 虚拟地址先经过分页机制映射到线性地址,然后线性地址通过分段机制映射到物理地址
D 线性地址先经过分页机制映射到虚拟地址,然后虚拟地址通过分段机制映射到物理地址
正确答案 A:此属于段页式内存管理,先通过地址中的段号,找到段表项,通过段表项中段内页表起始地址找到自己的页表,通过地址中的段内页号,在这个页表中找到页表项,通过页表项中的物理块号和页内偏移最终得出物理地址
2、对于Linux说法,下列说法正确的是()
A 线性访问内存非法时,当前线程会进入信号处理函数
B 用mv命令移动文件时,文件的修改时间会发生变化
C ulimit -c设置的是函数调用栈的大小
D malloc函数是应用程序向操作系统申请内存的接口
正确答案 B:当线性访问内存非法时,系统会向当前线程发送一个信号,此时线程会进入信号处理函数去处理这个信号;B选择中MV命令移动文件时不会修改时间;C选择中ulimit用于shell启动进程所占用的资源.-c size:设置core文件的最大值.单位:blocks;
3、以下说法不正确的是()
A 进程调度中"可抢占"和"非抢占"两种方式,后者引起系统的开销更大
B 每个进程都有自己的文件描述符表,所有进程共享同一打开文件表和v-node表
C 基本的存储技术包括RAM,ROM,磁盘以及SSD,其中访问速度最慢的是磁盘,CPU的高速缓存一般是由RAM组成的
D 多个进程竞争源出现了循环等待可能造成系统死锁
正确答案 A:可抢占调度比非抢占调度引起系统的开销更大
4、下述哪种情况会提出中断请求()
A 在键盘输入过程中,每按一次键
B 两数相加结果为零
C 计算结果溢出
D 一条系统汇编指令执行完成
正确答案 A:
5、以下哪些不是内核对象()
A 进程
B 线程
C 互斥器
D 临界区
正确答案 D:临界区属于用户态对象,只能在用户态来操作
6、如果系统的umask设置为244,创建一个新文件后,它的权限:()
A --w-r–r--
B -r-xr–r--
C -r—w–w
D -r-x-wx-wx
正确答案 C:umask是设置文件和目录的默认权限的掩码。默认权限=~(244)=533,目录新创建出来的默认权限则为533,但是如果是文件则默认取消可执行的权限,所以为522
7、由源代码生成可执行文件需要经过预编译,编译,汇编,链接等阶段,错误:unresolved external symbol BeginScene属于()阶段错误。
A 预编译
B 编译
C 汇编
D 链接
正确答案 D:
8、程序出错在什么阶段()?
int main(void)
{
http://www.taobao.com
cout << "welcome to taobao" << endl;
return 0;
}
A 预处理阶段出错
B 编译阶段出错
C 汇编阶段出错
D 链接阶段出错
E 运行阶段出错
F 程序运行正常
正确答案 F:http:相当于1个标签(C++很少是用的语法),而后面两个斜杠相当于是注释,将后面的内容注释掉了
编程题
题目1:
解题思路:这种问题我们可以将硬币分成3部份,如果3份都相同则任意任意取两份进行称重,如果两个这两份一样重,则说明假币在第三份中,则继续将第三份进行划分成3部分,一次类推,直到最后为1的情况则就能找出。
代码:
#include <iostream>
using namespace std;
int main()
{
int n;
while (cin >> n && n != 0)
{
int count = 0;
while (n > 1)
{
if (n % 3 == 0)//能平均分成3份
{
n /= 3;
}
else //余1或者余2,都是取平均划分的3份+1
{
n = n / 3 + 1;
}
++count;
}
cout << count << endl;
}
return 0;
}
题目2:
解题思路:这道题我们可以将问题转换为0-1背包问题
我们可以认为我们有min-max的所有容量的背包
代码:
class Solution {
public:
int getFirstUnFormedNum(vector<int> arr, int len)
{
int min = arr[0];
int max = 0;
for (const auto& e : arr)
{
if (e < min)
min = e;
max += e;
}
//背包0-10个背包,一共有11个背包
//dp[j]为空间为j的背包的最大承重
vector<int> dp(max + 1, 0);
for (int i = 0; i < len; ++i)//依次放入物品
{
//j为背包空间的大小
//dp[j]为背包的最大承重
//背包空间如果比物品重量小,则不需要再看
for (int j = max; j >= arr[i]; --j)
{
//j-arr[i]为放入i号物品后剩余容量
//需要查看空间为剩余容量的背包最大承重dp[j - arr[i]]
//剩余容量的背包最大承重dp[j - arr[i]]+i号物品
//如果比这个背包之前的承重还重,则需要更新
if (arr[i] + dp[j - arr[i]]> dp[j])
{
dp[j] = dp[j - arr[i]] + arr[i];
}
}
}
//查看背包的空间和背包的最大承重的关系
for (int i = min; i <= max; ++i)
{
if (i != dp[i])
return i;
}
return max+1;
}
};
以上是关于每日一题 | day29 (有假币| 求正数数组的最小不可组成和)的主要内容,如果未能解决你的问题,请参考以下文章
每日一题 | day15( 查找输入整数二进制中1的个数 | 手套)
leetcode每日一题(2020-06-27):41. 缺失的第一个正数