选择题。
1. 当分配给一个进程的页面数增加时,页故障数可能增大也可能变小,下述算法符合这种情况的什么算法?
答案是:A. FiFo算法。
此题的题意是:在页面置换算法中,哪一种算法随着给定页面数的增加,缺页中断次数有可能还会增加或者减小。FiFo算法就是先进先出,最先调入的页面,在页面数满,并且发生缺页时,就置换出最早调入的。LRu算法就是替换最长未使用的页面。clock算法是lru算法的优化。
2.一个提供NAT服务的路由器在转发一个源IP地址为10.0.0.1、目的IP地址为131.12.1.1的IP分组时,可能重写的IP分组首部字段是?
答案是:TTL、片偏移量和源IP地址。
在路由器的分组转发过程中,间接转发时,源IP地址随着路由器的变化在不停变化,生存时间(TTL)每跳过一个路由器减1,片偏移量和偏移标志、首部检验和也可能发生变化。但目的IP地址始终不会变化。
3.sql中,可以用来替换DISTINCT的语句是?
答案是:GROUP BY
DISTINCT关键字是去重的意思。
select 姓名 from 表名 group by 姓名 = select distinct 姓名 from 表名
编程题。
1.牛牛有一些排成一行的正方形。每个正方形已经被染成红色或者绿色。牛牛现在可以选择任意一个正方形然后用这两种颜色的任意一种进行染色,这个正方形的颜色将会被覆盖。牛牛的目标是在完成染色之后,每个红色R都比每个绿色G距离最左侧近。牛牛想知道他最少需要涂染几个正方形。
如样例所示: s = RGRGR
我们涂染之后变成RRRGG满足要求了,涂染的个数为2,没有比这个更好的涂染方案。
解析:使用两个数组lsz和rsz,lsz表示str中当前字符左边的‘G’个数,rsz表示str中当前字符右边的‘R’个数.然后从头至尾相加,找出最小和即为答案。代码如下:
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main()
{
string str = "";
getline(cin, str);
int size = str.size();
vector<int>ldp(size, 0);
vector<int>rdp(size, 0);
// 填写当前ldp中当前数左边的G的个数
int l=0;
for(int i=0; i<size; ++i)
{
ldp[i] = l;
if(str[i] == 'G')
++l;
}
// 填写当前rdp中当前数右边的R的个数
int r=0;
for(int i=size-1; i>=0; --i)
{
rdp[i] = r;
if(str[i] == 'R')
++r;
}
// 开始计算
int res = 100;
for(int i=0; i<size; ++i)
{
if(ldp[i] + rdp[i] < res)
res = ldp[i] + rdp[i];
}
cout << res << endl;
return 0;
}
2. 牛牛养了n只奶牛,牛牛想给每只奶牛编号,这样就可以轻而易举地分辨它们了。 每个奶牛对于数字都有自己的喜好,第i只奶牛想要一个1和x[i]之间的整数(其中包含1和x[i])。
牛牛需要满足所有奶牛的喜好,请帮助牛牛计算牛牛有多少种给奶牛编号的方法,输出符合要求的编号方法总数。
解析:对输入的x[i]值进行从小到大排序,每只牛能够编成的号数其实就为想x[i]-i。代码如下:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int n;
while(cin >> n)
{
vector<int> vec(n, 0);
for(int i=0; i<n; ++i)
cin >> vec[i];
sort(vec.begin(), vec.end());
long long sum = 1;
for(int i=0; i<n; ++i)
{
sum *= (vec[i]-i);
sum %= 1000000007;
}
cout << sum << endl;
}
return 0;
}
3. 如果一个数字满足以下条件,我们就称它为奇异数:
1、这个数字至少有两位
2、这个数的最低两位是相同的
比如: 1488是一个奇异数,而3、112不是。
牛牛现在给出一个一个区间[L,R],让你计算出在区间内有多少个奇异数
解析:本题在做的时候,可以计算1~L之间的奇异数个数和1~R之间的奇异数个数,然后荣右边的减去左边的就好,那么问题就归结为如何求一个给定数n的小于n的所有奇异数的个数。可知1~100中有10个百位奇异数,2~200中有10个百位奇异数,1~1000中有10*10个千位奇异数。对于两位数,10~19有一个奇异数,20~29有一个奇异数,利用数字特点进行计算。代码如下:
#include <iostream>
using namespace std;
// 利用数字的特点进行计算
long long func(long long v)
{
long long res = 0;
res = (v/100)*10;
v = v%100;
long long next = v/10;
res += next;
long long remain = v%10;
if(remain<next)
--res;
return res;
}
int main()
{
long long L, R;
while (cin >> L >> R) {
long long result = func(R) - func(L);
long long a = (L / 10) % 10;
long long b = L % 10;
if (a == b)
result++;
cout << result << endl;
}
return 0;
}