设为首页 收藏本站
查看: 1314|回复: 0

[经验分享] 算法题之三道2016华为校招上机笔试题

[复制链接]

尚未签到

发表于 2017-7-10 08:06:15 | 显示全部楼层 |阅读模式
  为了准备应聘过程中的机试环节,找了些OJ机试题来做做。看了帖子http://www.cnblogs.com/whc-uestc/p/4733992.html后用自己的方法对三道华为机试题进行了编写。
  题1
   DSC0000.jpg



#include <iostream>
#include <string>
#include <vector>
using namespace std;
int getmax(vector<int> vec, int a, int b)
{
int max=0;
for(int i=a-1;i<=b-1;i++)
{
if(max<vec)
{
max=vec;
}
}
return max;
}
int main(){
//vector<Log> vec;
//Log lg;
//while(cin>>lg.path>>lg.row){
//    writeLog(vec,lg);
//}
//for(int i=0; i<vec.size(); i++)
//    cout<<vec.path<<" "<<vec.row<<" "<<vec.count<<endl;
//return 0;
//string inputstr;
//int a;
//int b;
//char c[3];
//while(cin>>inputstr>>a>>c)
//{
//    cout<<inputstr<<a<<c<<'/n'<<endl;
//}//"cin>>string/int/char"以空格为分隔符跳入下一个">>"输入操作
//cout<<inputstr<<endl;
//cout<<a<<endl;
//cout<<c<<endl;
//cout<<lg.row<<endl;
int N,M,tem;
cin>>N>>M;
int n=N;
int m=M;
vector<int> score;//保存分数
while(n--)//输入分数并保存操作,不清除输入缓冲区,保证输入的一列被录入
    {
cin>>tem;
score.push_back(tem);
}
char mode;
int A,B;
vector<int> answer(M);//想对vector直接赋值就得定义大小,如果不定义大小,直接赋值会出错,只能用push_back
int i=0;//答案下标
while(m--)
{
cin.sync();//清空cin输入缓冲区,1.保证输入的是当前输入行的数据;2. 保证每次输入的是一行中的数据
cin>>mode>>A>>B;
if(mode=='Q')
answer[i++]=getmax(score,A,B);
else
score[A-1]=B;//将第A个ID改为B
    }
for(int j=0;j<i;j++)
cout<<answer[j]<<endl;
}
//样例输入:
//5 6
//1 2 3 4 5
//Q 1 5
//U 3 6
//Q 3 4
//Q 4 5
//U 2 9
//Q 1 5
  题2
   DSC0001.jpg



#include <iostream>
#include <string>
#include <vector>
using namespace std;

struct Log
{
string name;
int row;
int times;
};
string getname(string &addrandname)
{
string name;
int N=addrandname.size(),num=1;
while(addrandname[N-num]!='\\'&&num!=17)//跳出循环条件,遇到\或第17次循环
    {
num++;
}
name=addrandname.substr(N-num+1,num-1);
return name;
}
void savelog(vector<Log> &vec_log, Log log)
{
int N=vec_log.size(),flag=0;
for(int i=0;i<N;i++)
{
if(vec_log.name==log.name&&vec_log.row==log.row)
{
vec_log.times++;
flag=1;
}
}
if(flag==0)
{
vec_log.push_back(log);
}
}
void prin(vector<Log> vec_log)
{
int N=vec_log.size();
for(int i=0;i<N;i++)
{
cout<<vec_log.name<<" "<<vec_log.row<<" "<<vec_log.times<<endl;
}
}
int main()
{
string addrandname;
int row;
cin.sync();//清除输入缓冲区中的数据流
cin.clear();// 将流中的所有状态值都重设为有效值
vector<Log> vec_log;
Log log;
while(cin>>addrandname>>row)
{
log.name=getname(addrandname);
log.row=row;
log.times=1;
savelog(vec_log,log);
prin(vec_log);
cin.sync();
cin.clear();
}

//string name,aa="123456789123456789.c";
//name=getname(aa);
//cout<<name<<endl;
//addrandname="aaaa";
//addrandname="fie";
//cout<<addrandname<<endl;
}
  题3
   DSC0002.jpg



#include<iostream>
#include<string>
#include<vector>//vector完全可以替代数组,以后数组用vector,字符串用string,char、int、double只用于单个变量
using namespace std;
//单张1 对子3 三个5 顺子9 四个7 对王11
//首先判断是否存在一对王
//判断是否存在四个
//剩下的比较第一张牌大小
//难点:string类的使用,比较,赋值,长度等
//单张牌大小的比较
bool is2joker(string str)//判断是否为一对王
{
string joker2="joker JOKER",joker21="JOKER joker";
if(str==joker2|str==joker21)//怎么比较两个string
return true;
return false;
}
bool isquar(string str)//判断是否为四个一样的牌
{
if(str.size()==7)
if(str[0]==str[6])
return true;
return false;
}
int pai2num(string str_01)
{
int re;
if(str_01=="jo")
re=16;
else if(str_01=="JO")
re=17;
else
{
switch(str_01[0])
{
case '3':re=3;break;
case '4':re=4;break;
case '5':re=5;break;
case '6':re=6;break;
case '7':re=7;break;
case '8':re=8;break;
case '9':re=9;break;
case '10':re=10;break;
case 'j':re=11;break;
case 'q':re=12;break;
case 'k':re=13;break;
case 'a':re=14;break;
case 'J':re=11;break;
case 'Q':re=12;break;
case 'K':re=13;break;
case 'A':re=14;break;
case '2':re=15;break;
default:re=0;break;
}
}
return re;
}
bool isbig(string str1,string str2)//判断牌面值的大小
{
return pai2num(str1.substr(0,2))>pai2num(str2.substr(0,2))?true:false;
}
void main()
{
string str;//这样的string类型只能由getline(cin,str)全局函数赋值
//char 类型的向量只能由cin.get(str,size)或cin.getline()赋值
string str1;
string str2;
getline(cin,str);//getline(cin,str,'/n')和cin.getline(char[],size)区别
int loc=0;
int loc1=0;
int loc2=0;
int flag1=0;//是否遇到-
cout<<str.size()<<endl;
for(loc;loc<str.size();loc++)
{
//用什么方法在string后加入字符?如下
//str1+=str[loc];//为什么不能用str1.append(str[loc])或str1.push_back(),因为参数必须为string类型,而不能是char类型
//cout<<str1<<endl;
//string类型的用法?
//赋值时用用“”括起来的内容,有+=,append(),insert()方法
//string类型不能用于switch(case 只能用于数值和单个字符‘’的内容比较),一般用if() else if()代替(if和elseif只执行一条,前面的优先级高)
if(str[loc]=='-')
{
flag1=1;
loc++;
}
if(flag1==0)
str1+=str[loc];
else
str2+=str[loc];
}
cout<<"一手牌为:"<<str1<<endl;
cout<<"另一手牌为:"<<str2<<endl;
if(is2joker(str1)|is2joker(str2))//是否有一对王
    {
string bigone;
bigone=is2joker(str1)?str1:str2;
cout<<"最大的手牌为:"<<bigone<<endl;
}
else if(isquar(str1)^isquar(str2))//是否其中一手为四张同样的牌
    {
string bigone;
bigone=isquar(str1)?str1:str2;
cout<<"最大的手牌为:"<<bigone<<endl;
}
else if(str1.size()==str2.size())//直接比第一张牌的大小即可
    {
string bigone;
bigone=isbig(str1,str2)?str1:str2;
cout<<"最大的手牌为:"<<bigone<<endl;
}
else
cout<<"ERROR"<<endl;
}
  笔记:
  1.OJ系统中的题目要求输入样例为一行或多行时,怎么考虑输入过程?
    因为OJ系统的输入样例和输出样例是一一对应的,每输入一行样例就进行处理和输入n行样例再进行统一处理不会影响评判结果。在不明确输入样例具体为几行时,一般用while(getline(cin,str)){}或者while(cin>>str1>>str2){}语句对每一行数据分别进行处理和输出;当知道输入样例的行数时(一个样例分为了几行数据),一般用while(N--){cin>>str1>>str2}语句连续记录N行输入数据后再进行处理。
  2.回顾了vector,string,getline(),cin.getline(),cin.get(),cin>>相关的知识
    vector:创建vector时若不规定大小(默认为空),需用push_back()进行”赋值“;创建时若规定了大小,可用[]和=进行指定位置的赋值。vector<>::iterator it; it可看做一个广义指针,指向容器中的元素;而vector<>* p2v;是指向容器的指针,p2v->el。
    string:完全可以代替字符数组char ch[]。一种特殊的字符容器(比单纯的字符容器更强大),可看作普通数据类型,能进行+(拼接)、=(赋值)、==(判断是否相等)等操作,一般用cin>>str和getline(cin,str)方式赋值。注:cin>>可对string和char数组进行赋值;getline()只用于对string赋值;cin.get()和cin.getline()只用于对char数组进行赋值。
    getline()与cin.getline()不同之处在于,前者可以规定文件结束符(默认为‘\n’),且它们是不同的概念,前者属于istream,后者属于cin流。注意:getline()在vc6下需要多打一个回车才能确定赋值(第一个回车是结束符,第二回车是输入结束标志?),而在vs下只需一个回车符。
    cin.get():虽然可用于获得字符串,但一般用于取一个字符(任何字符)。
    cin>>:以‘ ’为分隔符,‘\n’为结束符。一次>>到分隔符为至,剩余字符保存在缓冲区中,可用于下一个>>操作。为了避免误操作,一般用cin.clear()和cin.sync()恢复cin状态和清空缓冲区。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-392227-1-1.html 上篇帖子: 我为什么离开华为 下篇帖子: 如何查看华为EMUI系统APK源码?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表