问答题
问答题1:TCP建立连接的过程采用三次握手,已知第三次握手报文的发送序列号为 1000,确认序列号为 2000,请问第二次握手报文的发送序列号和确认序列号分别为?
已知第三次握手的发送序列号和确认序列号,那么第二次和第一次都可以知道
确认序列号是告诉对方,这个数字之前的数据我都收到了,下次你就按这个确认序列号对我进行发送;发送序列号的想告诉对方,如果你接收到了,那么下次你的确认序列号应该要加 1
问答题2:一台刚刚接入互联网的WEB服务器第一次被访问到时,不同协议的发生顺序是下面中的?
A: ARP -> DNS -> HTTP
B: ARP -> HTTP -> DNS
C: DNS -> HTTP -> ARP
D: DNS -> ARP -> HTTP
E: HTTP -> ARP -> DNS
F: HTTP -> DNS -> ARP
提示:当给WEB服务器接上网线的时候,它会自动发送一条 ARP 信息,使得接入网关能找的到它;网关上会形成一条类似:2c 96 1e 3c 3e 9b - 192.168.1.123的MAC地址到IP地址的映射记录
当第一个用户使用域名访问WEB服务器的时候,首先要进行一次DNS查询,最后才是 http 协议
问答题3:一台主机要实现通过局域网与另一个局域网通信,需要做的工作是?
A: 配置域名服务器
B: 定义一条本机指向所在网络的路由
C: 定义一条本机指向所在网络网关的路由
D: 定义一条本机指向目标网络网关的路由
提示:如果主机想访问本地局域网外的某一网络,需要做两件事
1、设置本机的默认网关 ,指向所在网络网关的路由
2、本地局域网默认网关上需要设置一条路由,用以完成本地局域网内的任一主机到目标局域网主机的路由工作
编程题
编程题1:骆驼命名法
从 C/C++ 转到 Java 的程序员,一开始最不习惯的就是变量命名方式的改变,C语言风格使用下划线分隔多个单词,例如“hello_world”
; 而 Java 则采用一种叫骆驼命名法的规则:除首个单词以外,所有单词的首字母大写,
例如“helloWorld”
请你帮可怜的程序员们自动转换变量名。
输入描述:输入包含多组数据,每组数据一行,包含一个 C 语言风格的变量名。每个变量名长度不超过100
输出描述:对应每一组数据,输出变量名相应的骆驼命名法
示例:
输入
hello_world
nice_to_meet_you
输出
helloWorld
niceToMeetYou
#include <iostream>
#include <string>
using namespace std;
int main(){
string str;
while(cin>>str){
string res;
for(int i = 0;i<str.size();++i){
if(str[i]=='_'){
str[i+1]-=32;
}else{
res +=str[i];
}
}
cout<<res<<endl;
}
return 0;
}
编程题2:单词倒排
对字符串中的所有单词进行倒排
1、每个单词是以 26 个大写或小写英文字母构成;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
输入描述:输入一行以空格来分隔的句子
输出描述:输出句子的逆序
示例:
输入
I am a student
输出
student a am I
#include<iostream>
#include<sstream>
#include<string>
#include<vector>
using namespace std;
int main() {
string str;
while (getline(cin, str)) {
vector<string> res;
for (int i = 0; i < str.size(); i++)
if (!isalnum(str[i]))
str[i] = ' ';
// 字符串分割
stringstream ss;
ss<< str;
string tmp;
while(ss>>tmp){
res.push_back(tmp);
}
// 字符串的输出
cout << res[res.size() - 1];
for (int i = res.size() - 2; i >= 0; i--)
cout << " " << res[i];
cout << endl;
}
return 0;
}
编程题3:乒乓球筐
nowcoder 有两盒(A、B)乒乓球,有红双喜的、有亚力亚的……现在他需要判别A盒是否包含了B盒中所有的种类,并且每种球的数量不少于B盒中的数量,该怎么办呢?
输入描述:输入有多组数据。每组数据包含两个字符串A、B,代表A盒与B盒中的乒乓球,每个乒乓球用一个大写字母表示,即相同类型的乒乓球为相同的大写字母。字符串长度不大于10000
输出描述:每一组输入对应一行输出:如果B盒中所有球的类型在A中都有,并且每种球的数量都不大于A,则输出“Yes”;否则输出“No”
示例:
输入
ABCDFYE CDE
ABCDGEAS CDECDE
输出
Yes
No
建立一个哈希表进行映射关系的判断
#include <iostream>
#include <string>
using namespace std;
// ABCDFYE CDE
// ABCDGEAS CDECDE
int main(){
string strA,strB;
while(cin>>strA>>strB){
int arr[256] = {0};
for(int i = 0;i<strA.size();++i){
arr[strA[i]]++;
}
int cnt = 1;
for(int i = 0;i<strB.size();++i){
if(arr[strB[i]]){
arr[strB[i]]--;
}else{
cnt = 0;
}
}
if(cnt ==1){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}
return 0;
}
编程题4:查找兄弟单词
单词:由小写英文字母组成,不含其它字符
兄弟单词:所用的单词字符和个数相同,但是位置不相同,例 abc 和 acb 为兄弟单词,abc 和 adb 不是兄弟单词,abc 和 abc 也不是.
字典按照字典序的排序规则
注:字典中所含单词为[0,1000],单词所含字母[1,50]
输入描述:
先输入字典中单词的个数,再输入 n 个单词作为字典单词
再输入一个单词,查找其在字典中兄弟单词的个数
最后输入一个整数 index,表示第 index 的兄弟单词
输出描述:根据输入,输出查找到的兄弟单词的个数,和第 index 的兄弟单词
输入
3 abc bca cab abc 1
输出
2
bca
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool isBrother(string str, string s){
// 1. 先判定长度是否相同. 不相同的一定不是兄弟单词
if(str.size() == s.size()){
// 2. 再判定字符串是否完全相同. 相同了也不算兄弟三次
if(str == s)
return false;
// 3. 将两个单词排序. 排序后相同才是兄弟单词(因此参数不能用 const&)
sort(str.begin(), str.end());
sort(s.begin(), s.end());
if(str == s)
return true;
}
return false;
}
int main(){
int num;
while(cin>>num){
string str,word,s;
int index;
// 存放单词的字典
vector<string>vs;
for(int i = 0;i<num;++i){
cin>>str;
vs.push_back(str);
}
sort(vs.begin(),vs.end());
cin>>word;
cin>>index;
int counts = 0;
for(int i = 0; i < num; ++i){
if(isBrother(word, vs[i])){
counts++;
// 将第 k 个兄弟单词保存到 s 中.
if(counts == index)
s = vs[i];
}
}
if(!vs.empty())
cout << counts << endl;
if(counts >= index)
cout << s << endl;
}
return 0;
}