C++ 编程题/单词倒排,骆驼命名法,查找兄弟单词

问答题

问答题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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿的温柔香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值