1.下面哪些项是TCP具有的能力?()
*有链接
*数据库可靠传输
*端到端流量控制
2.在公司局域网上 ping www.bilibili.com 没有涉及到的网络协议是?()
*TCP
3.以下哪个数据结构底层使用红黑树实现的?()
*map
4.以下ip地址钟不属于私网地址的是:()
*127.2.0.1
5.下列排序算法中,最坏情况时间复杂度与其他选项不同的是()
*归并排序
6.下面哪一项正则能正确的匹配网址:http://www.bilibili.com/video/av21061574()
*/^(http://)?(\w+).bilibili.com/?video/av(\d{1,8})/?$/
7.以下设计模式的应用场景中,属于代理模式的选项有()
*防火墙
*CopyOnWriteList
8.由3个“1”和5个“0”组成的8位二进制补码,能表示的最小整数()
*-125
9.深度为k的二叉树至少由几个结点()
*2^k-1
10.以下软件设计模式的应用场景中,属以下git命令中,用于显示工作区和当前分支文件的差异的命令是()
*git diff HEAD
11.下面哪些拘束属于局域网技术()
*FDDI
*令牌环
12.线程的哪些资源可以共享()
*堆
*静态变量
13.列哪个是建立TCP连接的正确流程:()
*客户端向服务器端发送SYN包;服务端向客户端发送SYN+ACK;客户端回复ACK
14.以下说法正确的是:()
*非静态方法不存在线程安全的问题
15.两个人抛硬币,规定第一个抛出正面的人必须穿女装,请问先抛的人穿女装的概率多大?()
*2/3
16.有限状态自动技能识别()
*正规文法
17.按照二叉树的定义,具有3个节点的二叉树有几种。()
*5
18.无向图G=(V,E),其中V={a,b,c,d,e,f} E={(a,b),(a,e),(a,c),(b,e),(c,f),(f,d),(e,d)}对盖度进行深度优先遍历,得到的顶点序列正确的是()
*a,b,e,d,f,c
19.如果文法G存在一个句子,满足下列条件之一时,则称该文法是二义文法。()
*该句子有两个不同的最左推导
*该句子有两个不同的最右推导
*该句子有两棵不同的语法树
20.设指针q只想点链表中结点A,指针p指向单链表中节点A的后续结点B,指针s指向被插入的结点X,则在节点A和节点B插入节点X的操作序列为()
*q->next=s; s->next=p;
21.a-(b+c)*d+e/f的逆波兰式是
(1) abc+d-ef/+
22.当前发送帧数据为101010,发送方和接收方约定除数为1101,用循环冗余算法进行封装后,接收方拿到的数据是()
*101010011
23.一个完全二叉树有870个节点,其叶子节点个数为
*435
24.设某棵二叉树的中序遍历序列为cadb,前序遍历序列为acbd,这个二叉树的后续遍历序列是
*cdba
25.设一组初始关键字序列为(38,65,97,76,13,27,10),则第3套冒泡排序结束后的结果为
*38,13,27,10,65,76,97
26.在TCP/IP网络中,TCP协议工作在
*传输层
*应用层
27.HTTP协议中的禁止访问(Forbidden)的状态码是
*403
28.在SQL查询时,如果去掉查询结果中的重复组,需要使用
*distinct参数
29.执行C语言程序段“y=1;x=5;while(x–);y++;”后,y的值为
*2
30.对下列递归函数int f(int n) {return((n==0)?1:f(n-1)+2):},函数调用f(3)的返回值是
*7
31.实现一个HTML语法检查器。HTML语法规则简化如下:标签必须闭合,可以由开始和结束两个标签闭合,如
,也可以自闭合,如
标签可以嵌套如
如
属性的规则是name=“任意非引号字符”,多属性声明之间必须有空格,属性声明不符合规则时,整段HTML都算语法错误
输入文本只会出现字母a-z和<>"=
请用任意语言实现一个HTML语法检查器函数,有语法错误返回1,没有语法错误返回0
import java.util.*;
import java.util.Stack;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String str = input.nextLine();
int result = 1;
if(solve(str)) result = 0;
System.out.println(result);
}
public static boolean solve(String str){
str = str.trim(); //消除前后的空格
if(str == null && str.length() == 0) return false;
Stack<String> stack = new Stack<>(); //记录标签的入栈顺序
int i = 0;
while(i < str.length()){
if(i == 0 && str.charAt(i) != '<') return false; //第一个字符不是<,则表明不是以标签开始
if(i == str.length() - 1 && str.charAt(i) != '>') return false; //最后的字符不是>,则表明不是以标签结束
if(str.charAt(i) == '<'){
int j = i + 1;
//'<'之后如果是标签,紧跟在'<'之后的字符必定是a-z或者'/'
if(j < str.length() && (str.charAt(j) >= 'a' && str.charAt(j) <= 'z' || str.charAt(j) == '/')){
//获取标签字符串<xx xx="">
boolean inStr = false; //是否处于字符串"里面
while(j < str.length()){
if(!inStr && str.charAt(j) == '>'){ //标签结束
if(!checkAtt(str.substring(i + 1, j), stack)) //传入的标签已经去除'<'和'>'字符
return false; //属性有语法错误
i = j;
break;
}
else if(str.charAt(j) == '"') inStr = !inStr;
j++;
}
}
}
i++;
}
if(stack.isEmpty()) return true;
return false;
}
public static boolean checkAtt(String str, Stack<String> stack){ //处理标签里面的属性
if(str == null && str.length() == 0) return true;
int type = 0; //记录标签的类型,0为开始标签<x>,1为结束标签</x>,2为自闭合标签<x/>
if(str.charAt(0) == '/'){ //判断是否是结束标签
if(!(str.length() >= 2 && str.charAt(1) >= 'a' && str.charAt(1) <= 'z')) return false; //结束标签的'/'之后必须紧跟字母
type = 1; //为结束标签
str = str.substring(1);
}
str = str.trim(); //去除字符串后面的空格
if(str.charAt(str.length() - 1) == '/'){ //判断是否是自闭合标签
if(type == 1) return false; //不能同时为结束标签,又是自闭合标签
type = 2;
str = str.substring(0, str.length() - 1);// 去除最后的'/'
}
int i = 0;
//获取标签的名字,并判断是否符合闭合规则
while(i < str.length() && str.charAt(i) != ' ') i++;
String name = str.substring(0, i);
if(type == 0) stack.push(name);
else if(type == 1){
if(!stack.isEmpty() && stack.peek().equals(name)) stack.pop();
else return false;
}
//判断其属性是否有语法错误
boolean hasAtt = false; //判断该标签是否有属性,针对结束标签不能有属性
boolean hasBlank = false; //判断属性name之前是否有空格
while(i < str.length()){
while(i < str.length() && str.charAt(i) == ' ') {hasBlank = true; i++;}
while(i < str.length() && str.charAt(i) != '=' && str.charAt(i) != ' ') i++; //获取属性名字
if(i < str.length() && str.charAt(i) == '='){ //如果没有'='说明不是属性,不进行处理
i++;
if(i >= str.length() || str.charAt(i) != '"') return false; //'='之后必须是双引号
i++;
while(i < str.length() && str.charAt(i) != '"') i++; //寻找下一个双引号
if(i >= str.length()) return false;
if(!hasBlank) return false; //属性之前没有空格,语法错误
}
hasBlank = false;
hasAtt = true;
i++;
}
if(type == 1 && hasAtt) return false; //结束标签不能有属性
return true;
}
}
/*
1、’<’之后的字符如果不是a-z,则认为不是开始标签,可认为是标签的文本部分
2、“</”之后的字符如果不是a-z或者空格,则认为不是结束标签,认为是标签的文本部分
3、结束标签不能有属性,<a/>中’/’之后不能有属性
4、标签的文本部分可能是单独的双引号(例子:<div>”</div>,输出0)
5、题目说属性的规则是name=”任意非引号字符”,所以属性的’=’前和后都不能有空格
6、题目说属性之间必须有空格,这说明不是属性之间,就允许没有空格。超级坑的例子:
<fff><a name="x></a></fff><div>"/></fff><x o="p" q="rst"><z addr="></x>>"></z><y/><x/></x><u v="sfa"d"d"/>
答案输出0。最后的v=”sfa”d”d”,在不违背题目条件的情况下,只能认为v=”sfa”是属性,而d”d”不是属性,可以没有空格。同时也说明了,在标签里不是属性的字符串是允许存在的,没有错误的。
7、整个HTML字符串的前面和后面不能是文本内容
8、采用stack判断标签的闭合状态
9、如果采用练习模式,是没有例子的。估计是因为提示的例子是HTML字符串,所以浏览器会视其为html代码而执行,so可以采用浏览器检查代码看例子。当然浏览器会对错误的字符串进行处理,比如<a/>,在浏览器里会被处理为<a></a>。如果只有<a>,没有结束标签时,浏览器会自动补齐,添加</a>
10、我是菜鸟,对html的语法规则不是很了解,想了两天,呜~好惨
*/