小米校园招聘笔试题--括号智能纠错

一 问题描述:

二 解题思路:

因为要对括号序列进行插入操作,所以选择链表作为序列的数据结构,在判断括号序列是否合法时,要用到堆栈,所以选择堆栈用以存放左半括号

 

三 代码:

 

/*
This is a free Program, You can modify or redistribute it under the terms of GNU
*Description:2013年校园招聘--小米笔试题:括号智能纠错问题
*Language: C++
*Development Environment: VC6.0
*Author: Wangzhicheng
*E-mail: 2363702560@qq.com
*Date: 2013/1/6
*/
#include <iostream>
#include <cstdlib>
#include <string>
#include <list>
#include <stack>

using namespace std;

/*
*定义括号类型
*/
const char T1='(';
const char MT1=')';
const char T2='[';
const char MT2=']';
const char T3='{';
const char MT3='}';

class Match {
private:
	list<char>List;    //字符串组成的链表
	stack<char>Stack;  //字符栈
	int cnt;           //添加的括号数  
	/*
	 * 判断字符c1和c2是否匹配
	*/
	bool IsMatch(char c1,char c2) {
		if(c1 == T1 && c2 ==MT1) return true;
		if(c1 == MT1 && c2 ==T1) return true;
		if(c1 == T2 && c2 ==MT2) return true;
		if(c1 == MT2 && c2 ==T2) return true;
		if(c1 == T3 && c2 ==MT3) return true;
		if(c1 == MT3 && c2 ==T3) return true;
		return false;
	}
	/*
	 * 返回与字符c匹配的字符
	*/
	char CharMatch(char c) {
		if(c == T1) return MT1;
		if(c == MT1) return T1;
		if(c == T2) return MT2;
		if(c == MT2) return T2;
		if(c == T3) return MT3;
		if(c == MT3) return T3;
	}
public:
	Match(const string &input) {
		string::const_iterator it;
		for(it=input.begin();it!=input.end();it++) {
			List.push_back(*it);
		}
		cnt=0;
	}
	bool Correct(const string &input,string &result) {
		list<char>::iterator it;
		char c;
		bool match=true;
		for(it=List.begin();it!=List.end();it++) {
			if(*it==T1 || *it==T2 || *it==T3) Stack.push(*it);
			else {
				if(Stack.empty()==false && IsMatch(*it,Stack.top())) Stack.pop();  //已经匹配
				/*
				* 此时要么堆栈为空,要么栈顶元素和当前链表元素不匹配
				* 将与当前链表元素匹配的括号插入链表
				*/
				else {
					match=false;
					c=CharMatch(*it);
					List.insert(it,c);      //在当前位置前插入
					cnt++;
				}
			}
		}
		/*
		 * 此时链表中还有未匹配的括号
		*/
		while(!Stack.empty()) {
			match=false;
			c=Stack.top();
			c=CharMatch(c);
			Stack.pop();
			List.insert(it,c);
			cnt++;
		}
		for(it=List.begin();it!=List.end();it++) {
			result+=*it;
		}
		return match;
	}
	int getCnt() {
		return cnt;
	}
};

void main() {
	string input;
	string result;
	cout<<"请输入只含[ ] ( ) { }的括号表达式:";
	cin>>input;
	string::const_iterator it;
	for(it=input.begin();it!=input.end();it++) {
		if(*it==T1 || *it==MT1 || *it==T2 || *it==MT2
			|| *it==T3 || *it==MT3) continue;
		else {
			cerr<<"输入表达式非法!"<<endl;
			exit(1);
		}
	}
	Match match(input);
	if(!match.Correct(input,result)) {
		cerr<<"原表达式括号不匹配!"<<endl;
		cout<<"纠错后的表达式是:"<<result<<endl;
		cout<<"添加的括号数是:";
		cout<<match.getCnt()<<endl;
	}
	else cout<<"原表达式括号匹配!"<<endl;
}


四 测试:

内容概要:本文深入剖析了HTTPS中SSL/TLS握手的全流程,系统讲解了HTTPS的诞生背景及其相较于HTTP在安全性上的优势,重点阐述了SSL/TLS握手各阶段的技术细节,包括ClientHello、ServerHello、证书交换、密钥交换及加密通信建立等环节。文章结合加密基础概念(对称加密、非对称加密、哈希算法)和数字证书机制,解释了数据加密、身份验证与完整性保护的实现原理,并通过Wireshark抓包实例帮助读者直观理解握手过程中的数据交互。同时,归纳了常见握手失败问题及其解决方案,最后对SSL/TLS未来发展趋势进行了展望,涵盖抗量子加密算法和高效协议优化方向。; 适合人群:具备基本网络和安全知识的开发人员、运维工程师、网络安全爱好者,以及希望深入理解HTTPS底层机制的技术从业者;尤其适合1-3年经验、正在向中高级岗位发展的技术人员。; 使用场景及目标:①掌握HTTPS工作原理及SSL/TLS握手全过程,理解加密通信建立机制;②能够分析和排查HTTPS连接中的证书、加密套件、版本兼容等问题;③通过抓包实践提升对网络安全协议的实际分析能力;④为后续学习TLS 1.3、零RTT、前向保密等高级主题打下坚实基础; 阅读建议:此资源理论与实践结合紧密,建议在学习过程中同步使用Wireshark等工具进行抓包实验,对照文档中的握手阶段逐一验证各消息内容,加深对加密协商、证书验证和密钥生成过程的理解。同时关注最新TLS版本的发展趋势,拓展安全视野。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值