华为2017笔试题
华为认证覆盖路由交换、 无线局域网、无线、传送网、安全、统一通信、视讯 、 云计算、服务器、存储以及ICT融合设计等11个技术领域。下面是小编整理的关于华为2017笔试题,希望大家认真阅读!
1.删除字符串中的指定字符
1.1问题描述
输入两个字符串M和N,从字符串M中删除字符串N中所有的字符。例如,输入”abcda”和”ac”,则删除之后的'第一个字符串变成”bd”。
1.2问题求解
这个比较简单,给出如下参考代码:
#include
using namespace std;
void deleteCharacter(string& str0,string& str1){
for(int i=0;i
if(str1.find(str0[i])!=string::npos){
str0.erase(i,1);
continue;
}
++i;
}
}
2.成绩排名
2.1问题描述
题目总共包含如下两种格式的字符串命令:
LOD GRADE命令,其格式:
LOD GRADE:NAME=XiaoMing,MATH=80,LANG=90;
(1) 此命令用于导入学生成绩
(2) NAME字段表示学生姓名
(3) MATH字段表示学生数学成绩
(4) LANG字段表示语文成绩
(5) MATH字段和LANG字段顺序不一定MATH在前,LANG在后
(6) 相同的分数,名次相同,后面的名次空缺;例如100,99,99,99,98,98,名次:1,2,2,2,5,5
(7) 此命令会连续执行,直到遇到第一个LST GRADE
LST GRADE命令,其格式:
LST GRADE:NAME=XiaoMing;
(1) 此命令用于查询学生成绩
(2) NAME字段表示学生姓名
(3) 查询结果格式:姓名 数学 语文 总分 数学排名 语文排名 总排名
(4) 每组用例,此命令仅执行一次
输入: 连续多组LOD GRADE后跟一个LST GRADE查询命令
输出: 输出查询格式为:
姓名 数学 语文 总分 数学排名 语文排名 总排名
样例输入: LOD GRADE:NAME=XiaoMing,MATH=80,LANG=90;
LOD GRADE:NAME=XiaoHong,LANG=60,MATH=100;
LOD GRADE:NAME=XiaoMei,MATH=70,LANG=90;
LST GRADE:NAME=XiaoHong;
样例输出: XiaoHong 100 60 160 1 3 2
2.2问题求解
此问题也不难,没有涉及到复杂的算法,就是比较繁琐,主要考察数据的表示,字符串的提取与排序,下面给出参考代码:
#include
#include
#include
#include
using namespace std;
struct Student{
string name;
int math;
int lang;
Student(){
this->name="";
this->math=0;
this->lang=0;
}
Student(string name,int math,int lang){
this->name=name;
this->math=math;
this->lang=lang;
}
bool operator==(const Student& ele){
return this->name==ele.name;
}
};
//自定义比较函数,数学排名
bool compareMath(const Student& left,const Student& right){
return left.math>right.math; //降序排列
}
//自定义比较函数,语文排名
bool compareLang(const Student& left,const Student& right){
return left.lang>right.lang; //降序排列
}
//自定义比较函数,总分排名
bool compareTotal(const Student& left,const Student& right){
return left.math+left.lang>right.math+right.lang; //降序排列
}
int main(){
vector
string input;
Student student;
vector
while(getline(cin,input)){
int s=input.find("NAME=");
int e=input.find(',',s);
if(input.find("LOD GRADE")!=string::npos){ //输入成绩
student.name=input.substr(s+5,e-s-5);
s=input.find("MATH=");
e=input.find(',',s);
if(e==string::npos) e=input.length()-1;
student.math=stoi(input.substr(s+5,e-s-5));
s=input.find("LANG=");
e=input.find(',',s);
if(e==string::npos) e=input.length()-1;
student.lang=stoi(input.substr(s+5,e-s-5));
studentVec.push_back(student);
}else { //查询成绩
e=input.length()-1;
string name=input.substr(s+5,e-s-5);
Student student;
//数学排名
std::sort(studentVec.begin(),studentVec.end(),compareMath);
vector
student=*it;
while(it!=studentVec.begin()&&(it-1)->math==it->math) --it;
int mathRank=it-studentVec.begin()+1;
//语文排名
std::sort(studentVec.begin(),studentVec.end(),compareLang);
it=find(studentVec.begin(),studentVec.end(),Student(name,0,0));
while(it!=studentVec.begin()&&(it-1)->lang==it->lang) --it;
int langRank=it-studentVec.begin()+1;
//总分排名
std::sort(studentVec.begin(),studentVec.end(),compareTotal);
it=find(studentVec.begin(),studentVec.end(),Student(name,0,0));
while(it!=studentVec.begin()&&(it-1)->math+(it-1)->lang==it->math+it->lang) --it;
int totalRank=it-studentVec.begin()+1;
cout<
cout<
3.2动态规划法求解
递归法易于理解,但是存在对子问题的重复计算,时间效率低下,可以将子问题的结果存储起来,把递归实现,转换为迭代实现,这样就变成了动态规划。递归法是自顶向下,而动态规划是自底向上递归法是需要某个结果时就调用自己来计算,动态规划把每次递推的结果保存在数组中。因为这里有i,ir,j,jr一个4个变量,所以其实需要一个4维数组,这里用了一个宏代替,将4维数组通过下标转变变为一维数组。具体实现参考如下代码:
int func2 (const string &a ,const string &b) {
const int la = (int) a.length () ;
const int lb = (int) b.length () ;
vector
#define VRET(a ,b ,c ,d) (ret[(a) * la * lb * lb + (b) * lb * lb + (c) * lb + (d)])
for (int ix = la - 1 ; ix >= 0 ; ix--)
for (int irx =ix ; irx < la ; irx++)
for (int jx = lb - 1 ; jx >= 0 ; jx--)
for (int jrx =jx ; jrx < lb ; jrx++) {
int i = ix ;
int ir = irx ;
int j = jx ;
int jr = jrx ;
while (i <= ir && j <= jr && a[i] == b[j]) {
i++ ;
j++ ;
}
while (i <= ir && j <= jr && a[ir] == b[jr]) {
ir-- ;
jr-- ;
}
if (i > ir) { //A为空串
VRET (ix ,irx ,jx ,jrx) = (jr + 1 - j) + 2 ;
continue ;
} else if (j > jr) { //B为空串
VRET (ix ,irx ,jx ,jrx) = 2 ;
continue ;
}
int tmp = 2 + (jr + 1 - j) + 2 ; //最坏情况,将A全部删除再增加到B
for (int k = i + 1 ; k <= ir ; k++)
tmp = min (tmp ,2 + VRET (k ,ir ,j ,jr)) ;
for (int k = ir - 1 ; k >= i ; k--)
tmp = min (tmp ,2 + VRET (i ,k ,j ,jr)) ;
for (int k = j + 1 ; k <= jr ; k++)
tmp = min (tmp ,(k - j) + 2 + VRET (i ,ir ,k ,jr));
for (int k = jr - 1 ; k >= j ; k--)
tmp = min (tmp ,(jr-k) + 2 + VRET (i ,ir ,j ,k));
VRET (ix ,irx ,jx ,jrx) = tmp ;
continue ;
}
return VRET (0 ,la - 1 ,0 ,lb - 1) ;
#undef VRET
【华为2017笔试题】相关文章:
华为上机试题汇总11-12
华为认证笔试题大全11-09
华为面试题2017年05-20
华为2017笔试试题05-15
2017华为笔试面试试题05-15
华为认证最新试题及答案09-27
华为测试面试题汇总09-02
2017华为JAVA考试试题10-26
华为Java面试题精选10-24