这里写目录标题
1、跨站攻击的问题如何预防
2、假设项目商用的话,需要考虑哪些问题及如何测试
3、对荣耀了解多少
荣耀是华为旗下手机品牌。
荣耀品牌成立于2013年。以“创新、品质、服务”为核心战略,为全球年轻人提供潮酷的全场景智能化体验,打造年轻人向往的先锋文化和潮流生活方式。
在IoT生态产品侧 ,荣耀推出融合终端 、配件产品。通过HILINK协议 和旗下荣耀亲选电商平台,与具有制造优势资源及IoT厂商合作,打造先锋、潮酷的产品
荣耀的眼光并不局限在手机上面,荣耀开始把这样的优势延续到其他领域。在IoT领域也展示了相当的竞争力。荣耀智能手表、荣耀电视、荣耀平板、荣耀笔记本电脑,荣耀路由器……荣耀开始构建一个围绕年轻群体的产品生态集合,扩展产品范围。荣耀与华为,同根而生,却走着不同的道路。华为手机开始便将苹果与三星定为目标,想要做每个人都想要的手机,荣耀则抓住移动互联网和年轻消费群两大机会,以此切入手机市场,最终也成为一个巨头。从最初的手机系列,到后来的独立品牌,从互联网手机的竞争,到如今全渠道的覆盖,荣耀完成了当初独立时的任务,守住了互联网这块北坡,并厮杀出自己的一片天地。荣耀的目标,也不再是小米,甚至不再是手机领域的成绩,它想成为全球年轻人第一科技品牌。这种长远的目光会为荣耀未来的发展奠定基础。
4、软件的生命周期?生命周期中哪部分花的时间最长?
软件维护是正解
5、说一下白盒测试的几种方法
(1)语句覆盖
使程序中的每个可执行语句都能执行一次的测试用例
(2)判定覆盖(分支覆盖)
对于判断语句,在设计用例的时候,要设计判断语句结果为True和False的两种情况
(3)条件覆盖
设计用例时针对判断语句里面每个条件表达式true 和 false各取值一次,不考判断语句的计算结果
(4)判定条件覆盖(分支条件覆盖)
设计测试用例时,使得判断语句中每个条件表达式的所有可能结果至少出现一次,每个判断语句本身所有可能结果也至少出现一次。
(5)条件组合覆盖
设计测试用例时,使得每个判断语句中条件结果的所有可能组合至少出现一次
(6)路径覆盖
设计测试用例时,覆盖程序中所有可能的执行路径
优点:这种覆盖方法可以对程序进行彻底的测试用例覆盖,比前面讲的五种方法覆盖度都要高。
缺点:于路径覆盖需要对所有可能的路径进行测试(包括循环、条件组合、分支选择等),那么需要设计大量、复杂的测试用例,使得工作量呈指数级增长。路径覆盖虽然是一种比较强的覆盖,但未必考虑判断语句中条件表达式结果的组合,并不能代替条件覆盖和条件组合覆盖。
6、http和https的区别
https协议需要到CA(Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。
http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的。Https协议是由SSL+Http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)
7、cookie和session的区别
- cookie 和session的区别是:cookie数据保存在客户端的浏览器上,session数据保存在服务器端。
- session过期与否取决于服务期的设定,cookie在生成的时候设置过期时间进去。
- cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session ;
- session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE ;
- 单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K;
- 所以将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中。
cookie和session的共同之处在于:cookie和session都是用来跟踪浏览器用户身份的会话方式。
Cookie 机制是通过检查客户身上的“通行证”来确定客户身份的话(请柬)
Session机制就是通过检查服务器上的“客户明细表”来确认客户身份(客户明细表)
当我们完全禁掉浏览器的Cookie的时候,服务端的Session也会不能正常使用。
Q: 客户端浏览器将 Cookie 功能禁用,或者不支持 Cookie 怎么办?
A: 一般这种情况下,会使用一种叫做 URL 重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。
Q:cookie为什么是不安全的?
cookie的信息是放在本地,很容易被获取到的,所以说是不安全的。
Cookie 和 Session 应用场景:
(1)登录网站,今输入用户名密码登录了,第二天再打开很多情况下就直接打开了。这个时候用到的一个机制就是cookie。
(2)session一个场景是购物车,添加了商品之后客户端处可以知道添加了哪些商品,而服务器端如何判别呢,所以也需要存储一些信息就用到了session
8、面向过程和面向对象的理解
面向过程
优点:性能比面向对象高,**因为类调用时需要实例化,创建对象,开销比较大,比较消耗资源;**比如单片机、嵌入式开发、 Linux/Unix等一般采用面向过程开发,性能是最重要的因素。
缺点:没有面向对象易维护、易复用、易扩展
面向对象
优点:易维护、易复用、易扩展**,由于面向对象有封装、继承、多态性的特性,**可以设计出低耦合的系统,使系统 更加灵活、更加易于维护
缺点:性能比面向过程低
9、多线程的上下文切换
一、CPU时间片
CPU时间片即CPU分配给每个线程的执行时间段,称作它的时间片。CPU时间片一般为几十毫秒(ms)。
二、什么是上下文切换
CPU通过时间片段的算法来循环执行线程任务,而循环执行即每个线程允许运行的时间后的切换,而这种循环的切换使各个程序从表面上看是同时进行的。而切换时会保存之前的线程任务状态,当切换到该线程任务的时候,会重新加载该线程的任务状态。而这个从保存到加载的过程称之为上下文切换。
若当前线程还在运行而时间片结束后,CPU将被剥夺并分配给另一个线程。
若线程在时间片结束前阻塞或结束,CPU进行线程切换。而不会造成CPU资源浪费。
**线程的上下文切换分为让步式上下文切换和抢占式上下文切换。
前者是指执行线程主动释放CPU,与锁竞争严重程度成正比,可通过减少锁竞争来避免;
后者是指线程因分配的时间片用尽而被迫放弃CPU或者被其他优先级更高的线程所抢占,一般由于线程数大于CPU可用核心数引起,可通过调整线程数,适当减少线程数来避免。
笔试复盘:
**1、
输入:第一行是每次读取的固定的长度 ;
第2-n行是需要合并的数组,不同的数组使用回车换行分隔
输出:合并的数组
难点:1、输入的行数不固定 2、每一行有几个数也不固定
例子:3
2,5,6,7,9,5, 7
1,7,4,3,4
输出:2 5 6 1 7 4 7 9 5 3 4 7
**
#include<iostream>
#include<vector>
using namespace std;
int main(){
int len;cin>>len;//每一次提取的固定长度
vector<string> allstr;
//需要合并的数组 strtemp
string strtemp;
int i,j,temp;
while(cin>>strtemp){
allstr.push_back(strtemp);
}
int sumlen=0;//sumlen总共的长度 len每一次的定长
//逗号也算 1个位置,因此是8
for(int i=0;i<allstr.size();i++){
sumlen += allstr[i].length();
}
string result;//用于存放字符串
int num=0,l=0;// num用来判断每一次遍历 固定长的 第几个
// l是算的 ','
while(sumlen){
for(int i=0;i<allstr.size();i++){
//多个字符串 并且从每一个进行截取
if(allstr[i].length()!=0){//还没取完
l=0;num=0;
for(int j=0;j<allstr[i].length();j++){
//j用来遍历每一个字符串
l++;
if(allstr[i][j]==','){
num++;//判断取了几个值 1,2,3, 取了三个
}
if(num==len){
break;
}
}
if(num==len){
result += allstr[i].substr(0,l);//逗号和值的长度 l
allstr[i]=allstr[i].erase(0,l);
}
else{
//剩下的字符串的 数字 长度 <len
result += allstr[i];
result += ',';
allstr[i].erase(0);
}
}
}
//所有字符串的剩余长度和
//主要是结束循环和和下一次的遍历
sumlen=0;
for(int i=0;i<allstr.size();i++){
sumlen += allstr[i].length();
}
}
result.erase(result.length()-1);
cout<<result<<endl;
return 0;
}
2、
请输入字符串字母的“高中低”以及先后顺序对其进行重组,优先按照“高中低”分为三组,然后再对每一组内的字母按照自然顺序进行排序,没有用null表示即可
输出的数组中不需要去掉重复的数组
属于高的字母:bdfhkl
属于中的字母:aceimnorstuvwxz
属于低的字母:gjpqy
输入:cvjjap
输出: null
acv
jjp
#include<iostream>
#include<vector>
#include <set>
using namespace std;
int main(){
set<char> high,middle,low;
char a[]={'b','d','f','h','k','l'};
char b[]={'a','c','e','i','m','n','o','r','s','t','u','v','w','x','z'};
char c[]={'g','j','p','q','y'};
for(int i=0;i<6;i++){
high.insert(a[i]);
}
for(int i=0;i<15;i++){
middle.insert(b[i]);
}
for(int i=0;i<5;i++){
low.insert(c[i]);
}
string s;cin>>s;
string ans_high,ans_middle,ans_low;
for(int i=0;i<s.size();i++){
if(high.count(s[i])!=0){
//也可以使用计数 high.count(s[i])!=0
ans_high.push_back(s[i]);
}
else if(middle.count(s[i])!=0){
ans_middle.push_back(s[i]);
}
else{
ans_low.push_back(s[i]);
}
}
if(ans_high.size()==0){
cout<<"null"<<endl;
}
else{
cout<<ans_high<<endl;
}
if(ans_middle.size()==0){
cout<<"null"<<endl;
}
else{
cout<<ans_middle<<endl;
}
if(ans_low.size()==0){
cout<<"null"<<endl;
}
else{
cout<<ans_low<<endl;
}
return 0;
}
3、
由素数组成的数组arr,如果位置相邻的同学抱团位主持人手中的数则抱团成功,
输入:第一行为用例个数n
接下来的n行表示每一个需要抱团的数
输出:n个 Yes or No
在这里插入代码片