华为2023年笔试题_第1页
华为2023年笔试题_第2页
华为2023年笔试题_第3页
华为2023年笔试题_第4页
华为2023年笔试题_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

华为2023笔试题

1.删除字符串中的指定字符

1.1问题描述

输入两个字符串M和N,从字符串M中删除字符串N中全部的字符。例如,输入”abcda”和”ac”,则删除之后的”第一个字符串变成”bd”。

1.2问题求解

这个比拟简洁,给出如下参考代码:

#include

usingnamespacestd;

voiddeleteCharacter(stringstr0,stringstr1){

for(inti=0;i

if(str1.find(str0[i])!=string::npos){

str0.erase(i,1);

continue;

}

++i;

}

}

2.成绩排名

2.1问题描述

题目总共包含如下两种格式的字符串命令:

LODGRADE命令,其格式:

LODGRADE: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)此命令会连续执行,直到遇到第一个LSTGRADE

LSTGRADE命令,其格式:

LSTGRADE:NAME=XiaoMing;

(1)此命令用于查询学生成绩

(2)NAME字段表示学生姓名

(3)查询结果格式:姓名数学语文总分数学排名语文排名总排名

(4)每组用例,此命令仅执行一次

输入:连续多组LODGRADE后跟一个LSTGRADE查询命令

输出:输出查询格式为:

姓名数学语文总分数学排名语文排名总排名

样例输入:LODGRADE:NAME=XiaoMing,MATH=80,LANG=90;

LODGRADE:NAME=XiaoHong,LANG=60,MATH=100;

LODGRADE:NAME=XiaoMei,MATH=70,LANG=90;

LSTGRADE:NAME=XiaoHong;

样例输出:XiaoHong10060160132

2.2问题求解

此问题也不难,没有涉及到简单的算法,就是比拟繁琐,主要考察数据的表示,字符串的提取与排序,下面给出参考代码:

#include

#include

#include

#include

usingnamespacestd;

structStudent{

stringname;

intmath;

intlang;

Student(){

this-name=;

this-math=0;

this-lang=0;

}

Student(stringname,intmath,intlang){

this-name=name;

this-math=math;

this-lang=lang;

}

booloperator==(constStudentele){

returnthis-name==;

}

};

//自定义比拟函数,数学排名

boolcompareMath(constStudentleft,constStudentright){

returnleft.mathright.math;//降序排列

}

//自定义比拟函数,语文排名

boolcompareLang(constStudentleft,constStudentright){

returnleft.langright.lang;//降序排列

}

//自定义比拟函数,总分排名

boolcompareTotal(constStudentleft,constStudentright){

returnleft.math+left.langright.math+right.lang;//降序排列

}

intmain(){

vectorstudentVec;

stringinput;

Studentstudent;

vectorsplitedRes;

while(getline(cin,input)){

ints=input.find(NAME=);

inte=input.find(,,s);

if(input.find(LODGRADE)!=string::npos){//输入成绩

=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;

stringname=input.substr(s+5,e-s-5);

Studentstudent;

//数学排名

std::sort(studentVec.begin(),studentVec.end(),compareMath);

vector::iteratorit=find(studentVec.begin(),studentVec.end(),Student(name,0,0));

student=*it;

while(it!=studentVec.begin()(it-1)-math==it-math)--it;

intmathRank=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;

intlangRank=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;

inttotalRank=it-studentVec.begin()+1;

cout

cout

3.2动态规划法求解

递归法易于理解,但是存在对子问题的重复计算,时间效率低下,可以将子问题的结果存储起来,把递归实现,转换为迭代实现,这样就变成了动态规划。递归法是自顶向下,而动态规划是自底向上递归法是需要某个结果时就调用自己来计算,动态规划把每次递推的结果保存在数组中。由于这里有i,ir,j,jr一个4个变量,所以其实需要一个4维数组,这里用了一个宏代替,将4维数组通过下标转变变为一维数组。详细实现参考如下代码:

intfunc2(conststringa,conststringb){

constintla=(int)a.length();

constintlb=(int)b.length();

vectorret(la*la*lb*lb);

#defineVRET(a,b,c,d)(ret[(a)*la*lb*lb+(b)*lb*lb+(c)*lb+(d)])

for(intix=la-1;ix=0;ix--)

for(intirx=ix;irxla;irx++)

for(intjx=lb-1;jx=0;jx--)

for(intjrx=jx;jrxlb;jrx++){

inti=ix;

intir=irx;

intj=jx;

intjr=jrx;

while(i=irj=jra[i]==b[j]){

i++;

j++;

}

while(i=irj=jra[ir]==b[jr]){

ir--;

jr--;

}

if(iir){//A为空串

VRET(ix,irx,jx,jrx)=(jr+1-j)+2;

continue;

}elseif(jjr){//B为空串

VRET(ix,irx,jx,jrx)=2;

continue;

}

inttmp=2+(jr+1-j)+2;//最坏状况,将A全部删除再增加到B

for(intk=i+1;k=ir;k++)

tmp=min(tmp,2+VRET(k,ir,j,jr));

for(intk=ir-1;k=i;k--)

tmp=min(tmp,2+VRET(i,k,j,jr));

for(intk=j+1;k=jr;k++)

tmp=min(tmp,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论