剪花布条,客似云来
问答题
问答题1:某浏览器发出的HTTP 请求报文如下:
下列叙述中,错误的是?
提示:Connection: 连接方式 Close
表明为非持续连接方式, keep-alive
表示持续连接方式;Cookie
值是由服务器产生的, HTTP
请求报文中有 Cookie
报头表示曾经访问过www.test.edu.cn
服务器
问答题2:主机甲与主机乙之间已建立一个TCP 连接,双方持续有数据传输,且数据无差错与丢失。若甲收到 1 个来自乙的 TCP 段,该段的序号为 1913、确认序号为 2046、有效载荷为 100 字节,则甲立即发送给乙的 TCP 段的序号和确认序号分别是?
A: 2046、 2012
B: 2046、 2013
C: 2047、 2012
D: 2047、 2013
提示:甲在发送数据之前,明确两个信息
(1) 段序号为 1913,说明 乙 发给 甲 的数据段起始字节序号为 1913,有效载荷长度为 100,说明该数据段的长度为 100,那么甲下次需要的数据段的序号就是 1913 + 100 = 2013;
(2) 乙 发给 甲 的确认序号为 2046,说明 乙 这次需要 甲 发送的数据段的起始字节序号为 2046。获取这两个信息后,甲 即可确定要发给 乙 的序号为 2046(从乙的确认序号获知),确认序号为 2013(希望下次乙能够发送首字节序号 2013 的数据段过来)
问答题3:主机甲和乙已建立了TCP连接,甲始终以MSS=1KB大小的段发送数据,并一直有数据发送;乙每收到一个数据段都会发出一个接收窗口为10KB的确认段。若甲在t时刻发生超时时拥塞窗口为8KB,则从t时刻起,不再发生超时的情况下,经过10个RTT后,甲的发送窗口是?
A: 10KB
B: 12KB
C: 14KB
D: 15KB
提示:当t时刻发生超时时,把ssthresh设为8的一半,即为4,且拥塞窗口设为1KB。然后经历10个RTT后,拥塞窗口的大小依次为2、4、5、6、7、8、9、10、11、12,而发送窗口取当时的拥塞窗口和接收窗口的最小值,而接收窗口始终为10KB,所以此时的发送窗口为10KB,实际上该题接收窗口一直为10KB,可知不管何时,发送窗口一定小于等于10KB,选项中只有A选项满足条件
编程题4主机甲和主机乙之间建立一个TCP连接,TCP最大段长度为1000字节,若主机甲的当前拥塞窗口为4000字节,在主机甲向主机乙连续发送 两 个最大段后,成功收到主机乙发送的第一个段的确认段,确认段中通告的 接收 窗口大小为2000字节,则此时主机甲还可以向主机乙发送的最大字节数是?
A: 1000
B: 2000
C: 3000
D: 4000
提示:第一个段的确认段中通告的接收窗口大小为2000字节,即表明在接受到第一个报文段后,还有2000字节的缓存空间可用。 由于发送方发送了二个报文段,第二个段将占用剩下的2000字节中的1000字节,即一共还有(2000-1000=1000)字节,因而 此时主机甲还可以向主机乙发送的最大字节数是1000字节
编程题
编程题1:剪花布条
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
输入描述:输入包含多组数据,每组数据包含两个字符串s,t,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长
输出描述:对应每组输入,输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就输出0,每个结果占一行
示例
输入
abcde a3
aaaaaa aa
输出
0
3
提示:求在S串中,T串整体出现了多少次,利用 find 函数,首先从 pos 位置开始找,如果找到后,就跳过小饰条的长度再次找,直到找不到为止.
#include <iostream>
#include <string>
using namespace std;
int main(){
string s,t;
while(cin>>s>>t){
int res = 0;
size_t pos = 0;
while((pos = s.find(t,pos))!=string::npos){
pos+=t.size();
++res;
}
cout<<res<<endl;
}
return 0;
}
编程题2:客似云来
NowCoder开了一家早餐店,这家店的客人都有个奇怪的癖好:他们只要来这家店吃过一次早餐,就会每天都过来;并且,所有人在这家店吃了两天早餐后,接下来每天都会带一位新朋友一起来品尝。于是,这家店的客人从最初一个人发展成浩浩荡荡成百上千人:1、1、2、3、5……
现在,NowCoder想请你帮忙统计一下,某一段时间范围那他总共卖出多少份早餐(假设每位客人只吃一份早餐)
输入描述:测试数据包括多组,每组数据包含两个整数from和to(1≤from≤to≤80),分别代表开店的第from天和第to天
输出描述:对应每一组输入,输出从from到to这些天里(包含from和to两天),需要做多少份早餐
方法一:可以利用斐波那契数列求出前80项的和,利用跌加的方式计算出 from 到 to 的和
方法二 :可以利用一个公式 Sn = Fn+2 − 1
具体推导如下:通过特征方式计算出斐波那契数列的通项,然后利用等比数列的公式可推导出来
#include <iostream>
#define MAX 83 //如果用公式计算,需要接下来两项的值
void solve(long long num[]){
for (int i = 2; i < MAX; i++){
num[i] = num[i - 1] + num[i - 2];
}
}
//解法1:用遍历求和求解
long long sum_traversal(long long num[], int from, int to){
long long ans = 0;
//让数组下标从from - 1遍历到to - 1
for (int i = from - 1; i < to; i++){
ans += num[i];
}
return ans;
}
//解法2:用公式求解
long long sum_formula(long long num[], int from, int to) {
return num[to + 1] - num[from];
//第to + 2项的下标是to + 1,
//第from + 2 - 1项的下标是from
}
int main(){
int from, to;
long long num[MAX] = { 1, 1};
//提前计算Fibonacci数列
solve(num);
while (std::cin >> from >> to){
cout << sum_formula(num, from, to) << endl;
}
return 0;
}
还没有评论,来说两句吧...