知识点
由于TCP连接是全双工的,因此每个方向都必须单独进行关闭
第七层——应用层(Application)
这里的“应用”要和应用程序相区别。
当用户使用浏览器来打开网页时,需要利用DNS提供的域名解析服务,来获取网址对应的IP地址,然后再通过另外一个协议HTTP来下载页面内容。在这个过程中出现的两个协议(DNS和HTTP)都是工作在应用层上的协议。
- 物理层: RJ45 、 CLOCK 、 IEEE802.3 (中继器,集线器,网关) -
- 数据链路: PPP 、 FR 、 HDLC 、 VLAN 、 MAC (网桥,交换机) -
- 网络层: IP 、 ICMP 、 ARP 、 RARP 、 OSPF 、 IPX 、 RIP 、 IGRP 、 (路由器) -
- 传输层: TCP 、 UDP 、 SPX -
- 会话层: NFS 、 SQL 、 NETBIOS 、 RPC -
- 表示层: JPEG 、 MPEG 、 ASII -
- 应用层: FTP 、 DNS 、 Telnet 、 SMTP 、 HTTP 、 WWW 、 NFS
- 问题:有两个字符串str和str2,求出两个字符串中最长公共子串长度。
-
比如:str=acbcbcef,str2=abcbced,则str和str2的最长公共子串为bcbce,最长公共子串长度为5。
算法思路:
1、把两个字符串分别以行和列组成一个二维矩阵。
2、比较二维矩阵中每个点对应行列字符中否相等,相等的话值设置为1,否则设置为0。
3、通过查找出值为1的最长对角线就能找到最长公共子串。
针对于上面的两个字符串我们可以得到的二维矩阵如下:
从上图可以看到,str和str2共有5个公共子串,但最长的公共子串长度为5。
为了进一步优化算法的效率,我们可以再计算某个二维矩阵的值的时候顺便计算出来当前最长的公共子串的长度,即某个二维矩阵元素的值由item[i][j]=1演变为item[i][j]=1 +item[i-1][j-1],这样就避免了后续查找对角线长度的操作了。修改后的二维矩阵如
SQL
COUNT() 函数返回匹配指定条件的行数。
distinct
c++ stl
vector 动态数组
map<int,int>
C++ 关联容器之map插入相同键元素与查找元素操作
一、插入相同键元素操作
(1)insert方法
在map中的键必须是唯一的,当想map中连续插入键相同但值不同的元素时,编译和运行时都不会发生任何错误,系统会忽略后面的对已存在的键的插入操作,如
1 map<int,int> m1; 2 m1.insert(make_pair(1,2)); 3 m1.insert(make_pair(1,3)); 4 for(map<int,int>::iterator mit=m1.begin();mit!=m1.end();mit++){ 5 cout<<mit->first<<":"<<mit->second<<endl; 6 }
在第二行和第三行分别插入键都为1,但值不同的数据,此操作会忽略第三行的插入操作,其程序运行结果为:
1:2
----
替换空格
每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目。以"We are happy"为例,"We are happy"这个字符串的长度为14(包括结尾符号"\n"),里面有两个空格,因此替换之后字符串的长度是18。
接着再次从后往前遍历字符串,同时设置两个指针P1和P2,P1指向原始字符串末尾,P2指向替换之后的字符串末尾。我们向前移动P1,逐个把它指向的字符复制到P2指向的位置,直到碰到第一个空格为止。然后把P1向前移动一格,在P2之前插入字符串“%20”,同时P2向前移动3格。重复此过程,直到所有的空格都已替换完。这样只需要扫描一遍,时间复杂度为O(n)。
移动示意图如下:
public:
void replaceSpace(char *str,int length) {
if(str == NULL && length <= 0){
return;
}
/*original_length为字符串str的实际长度*/
int original_length = 0; //原始长度
int number_blank = 0; //空格数
int i;
while(str[i++] != '\0'){ //遍历字符串
++original_length; //长度+1
if(str[i] == ' '){
++number_blank; //遇到空格+1
}
}
/*new_length为把空格替换成'%20'之后的长度*/
int new_length = original_length + 2 * number_blank;
int index_original = original_length; //原始字符串末尾索引值
int index_new = new_length; //计算长度后的字符串末尾索引值
/*index_original指针开始向前移动,如果遇到空格,替换成'%20',否则进行复制操作*/
while(index_original >= 0 && index_new > index_original){
if(str[index_original] == ' '){
str[index_new--] = '0';
str[index_new--] = '2';
str[index_new--] = '%';
}
else{
str[index_new--] = str[index_original];
}
--index_original;
}
}
};