华为2019年3月软件开发工程师机考题解答

  • 题目展示
  • 题目一:从输入字符串中读取数据,计算百内加减法
  • 题目二:从输入字符串中读取所有的蛇形字符串,先按长度排序,长度相同的按字典序,输出

GitHub源码
https://github.com/ioMayday/shiyanlou/tree/master/Interview

题目展示


题目一:从输入字符串中读取数据,计算百内加减法

方法一 C++代码

// 华为2019机考题目1
//https: //blog.csdn.net/lyxleft/article/details/88698136
//Autor: TOMD
//Date: 2019年7月24日 15:02:42
// 方法一:取出加减号和数值,再分开进行运算#include <iostream>
#include <vector>
#include <string> //包涵stoi()using namespace std;int main() {cout << "Hello World!\n";string s,s_val;cin >> s;vector<char> operatorExp;vector<int> Val;int len = s.length();int i=0,j=0;//分离数值与运算符while(i<len){if (s[i]<='9' && s[i]>='0') ++i; //读取数值else if (s[i]=='+' || s[i]=='-' || s[i] == '=') //读取运算符{char temp_char = s[i];if ( temp_char != '=')   operatorExp.push_back(temp_char);s_val = s.substr(j,i-j); //string substr (起始位置, 字符个数);int temp_int = stoi(s_val); 从第0位开始,将2进制的字符串转化为10进制数字,直接将 stoi(s,0,2)对其cout会报错Val.push_back(temp_int);j = ++i;//下一个必然是数值}}//进行计算len = operatorExp.size();i=0;int result=Val[0];while(i<len){if (operatorExp[i] == '+'){result = result + Val[i+1];}else if (operatorExp[i] == '-'){result = result - Val[i+1];}++i;}cout <<"The calculation is " << s << result << endl;while (1){//让控制窗一直显示}return result;}

题目一:方法二 C++代码

// 华为2019机考题目1
//https: //blog.csdn.net/lyxleft/article/details/88698136
//Autor: TOMD
//Date: 2019年7月24日 15:02:42
// 方法二:负号直接将负值赋给对应数值再累加#include <iostream>
#include <vector>
#include <string> //包涵stoi()using namespace std;int main() {cout << "Hello World!"<< endl <<"The expression must end with <=> ! \n";string s,s_val;cin >> s;int len = s.length();int i=0,j=0,sum_val=0,temp_int=0;int flag_sgn=1;//默认为正,检测到负号后变为-1//检测表达式是否输入正确if (s[len-1] != '=')   {    //检测是否以等号结尾cout << "The input expression is wrong! Please input correctly again!" <<endl;return 0;}while(i<len){if ((s[i]<='9' && s[i]>='0') || s[i]=='+' || s[i]=='-' || s[i] == '=') ++i; //检测是否为数值及加减符号else {cout << "The input expression is wrong! Please input correctly again!" <<endl;return 0;}}i=0;//使用完i后置零,以便下个循环用//提取数值并运算while(i<len){if (s[i]<='9' && s[i]>='0') ++i; //读取数值else if (s[i]=='+' || s[i]=='-' || s[i] == '=') //读取运算符{s_val = s.substr(j,i-j); //string substr (起始位置, 字符个数);temp_int = flag_sgn*stoi(s_val); //用上一次的flag_sgn乘下一个读出来的数值,从第0位开始,将2进制的字符串转化为10进制数字,直接将 stoi(s,0,2)对其cout会报错temp_int = temp_int; //sum_val += temp_int; //累加计数到sum中if ( s[i] == '-')   flag_sgn = -1;else if( s[i] == '+') flag_sgn = 1;j = ++i;//移动到下一个数值起始位置,默认下一个必需是数值}}cout <<"The calculation is " << s << sum_val << endl;while (1){//让控制窗一直显示}return sum_val;}

题目二:从输入字符串中读取所有的蛇形字符串,先按长度排序,长度相同的按字典序,输出

测试成功


主要思路

1.找寻所有符合条件的子字符串,并记下长度
2.存入待输出的字符串进string
3.按长度规律输出,次之按字典序

3.1 拷贝将长度排序
3.2 依次找寻对应位置
3.3 输出相应长度字符串

主要代码如下

#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <algorithm>
#include <numeric> //用到求和函数
using namespace std;//测试:SxxsrR^AaSs
//理论输出:RrSs Aa Ssint main()
{cout << "Please input a correct string!"<<endl;string s;cin >> s;// 测试区
//   string s = "SxxsrR^AaSs"; //已测试通过
//   string s = "DAFHAGFAHFIUHRjkfhbdajfhkEHFUWEIHAJSDKHncnthasrkjhaejsavbdcnskdscnjkdfhgbvsdfdnfkhgj&*(&%^&*(bdvdhjBSDZVBDFBDVH"; //已测试通过cout << "The input string is " << s << endl;map<char, int> mA, ma;//mA存大写字母,ma存小写字母vector<int> len;int count_num=1; //默认最小子字符串长为1for (auto ss : s){if(ss >= 'A' && ss <= 'Z') mA[ss]++; //ss为关键字if(ss >= 'a' && ss <= 'z') ma[ss]++;}for (auto it = mA.begin(); it != mA.end();){//mA每个关键字对应键值取mA和ma中最小if(ma.count(it->first + 32) == 1) //ascii码中A为65,a为97,相差32{it++;}else mA.erase(it++);//如果ma中没有,则在mA中删除此关键字}/*for (auto x : mA)//遍历mA中的元素cout << x.first << "  " << x.second << endl;*/if(mA.empty()){cout << "Not Found" << endl; system("pause"); return 0;}//没有找到string tmp,tmp1;map<char, int>::iterator pre, cur;while (!mA.empty()){pre = mA.begin();cur = mA.begin();if(cur->second == 0){mA.erase(cur++);continue;}tmp += cur->first, tmp += cur->first + 32;cur->second--;//对应键值减一pre = cur, cur++;while (cur != mA.end() && cur->second > 0 && cur->first == pre->first + 1) //找寻连续的串{//继续往下查找的条件是没有到达结尾,当前的迭代器指向的键值不为0,并且与上一个字母是相邻的tmp += cur->first, tmp += cur->first + 32;cur->second--;pre++, cur++,count_num++;}len.push_back(count_num);count_num = 1; //每次查询后count_num置为1//cout << tmp << endl;//tmp.clear();}vector<int> len_sorted(len);vector<int> len_tmp(len);stable_sort(len_sorted.begin(), len_sorted.end());//输出检测出的蛇形字符串cout <<"All Serpentine string are " <<  tmp << endl;//按长度排序输出int start_pos=0;for (int i=len.size()-1; i>=0; i--){auto len_position = find( len.begin( ), len.end( ), len_sorted[i] ); //找到对应值的位置 len_position为len的迭代器int pos = distance(len.begin( ),len_position);len[pos] = 0; //找到输出一个字符串就消掉len中对应的字符串长度,置为0if (pos == 0) start_pos = 0; //若起点是0位,则无法累加前面的,直接赋值即可else { //若起点是非0位,则应累加前面到第a位以前的所有数值,得到原来字符串的起点位置for (int j=0;j<pos;j++) start_pos=2*len_tmp[j]+start_pos;}//int start_pos = 2*accumulate(len_tmp.begin(),len_position,0); //计算的区间为左闭右开 [len.begin(),len_position)//accumulate(len.begin(),len_position,0) 头两个形参指定要累加的元素范围,第三个形参则是累加的初值cout << tmp.substr(start_pos,2*len_sorted[i]) <<", The length of substring is " << 2*len_sorted[i] <<endl; //输出对应长度的子字符串start_pos=0; //运算完后,起点默认位置归零,进入下一个循环输出字符串}tmp.clear();system("pause");  //暂停系统,即无限循环return 0;
}

链接参考
[1] https://blog.csdn.net/lyxleft/article/details/88698136
[2] https://blog.csdn.net/qq_28584889/article/details/88706373

华为2019年3月软件开发工程师机考题解答 C++实现相关推荐

  1. 2019/04/12 华为通用软件开发工程师现场面试(offer到手)

    2019/04/12 华为通用软件开发工程师现场面试(offer到手) 时间轴 三月中旬做的笔试 3题ac两道 4/8 性格测试 4/12 现场面试 地点是 广州某家酒店,近地铁站的,中大过去也是要一 ...

  2. 某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休息日 是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对应月 份的休息日,用中括号进行标记.同时,统计出本月有几天

    某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休息日 是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对应月 份的休息日,用中括号进行标记.同时,统计出本月有几天 ...

  3. 某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休 息日是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对 应月份的休息日,用中括号进行标记.同时,统计出本月有几天

    By 张旭CaesarChang                合作: root121toor@gmail.com ~关注我  带你看更多精品知识 某公司软件开发工程师孙工,作息规律为上三天班,休息一 ...

  4. 招聘软件开发工程师---华为三康技术有限公司

    高端以太网产品线软件开发工程师岗位热招中... 招聘人数:40 工作地点:杭州 岗位要求: 1)电子.计算机.通讯等相关专业本科以上学历,专业基础好: 2)熟悉C/C++语言:有嵌入式软件系统开发经验 ...

  5. 中国移动云能力中心 Iaas 产品部软件开发工程师陈焱山:社区始于连接,也成就于连接...

    社区始于连接,也成就于连接 --陈焱山 ApacheCon 是 Apache 软件基金会(ASF)的官方全球系列大会.作为久负盛名的开源盛宴,ApacheCon 在开源界备受关注,也是开源运动早期的知 ...

  6. 招聘:JAVA软件开发工程师

    招聘:java软件开发工程师 本公司所有新创办的创业型小公司. 研发团队6-7个人. 工作地点:厦门软件园二期观日路 现需招聘java软件开发工程师2-3名 要求: 1.有良好的沟通能力.团队合作精神 ...

  7. 去哪儿2018春季校园招聘软件开发工程师笔试经验

    笔试公司:去哪儿网(Qunar.com) 笔试岗位:软件开发工程师 笔试时间:2018年4月2日15:00-17:00 笔试形式:赛码网在线做题 笔试回忆: 笔试共分为选择和编程两部分,选择题10道共 ...

  8. 算法工程师与软件开发工程师的区别

    本周入组,分到一个C++软件开发工程师的职位,要求熟悉QT开发应用,熟悉ITK.VTK等开源库的一种.领到任务后,开始进行寻访.很多事情,看上去很简单,做起来没那么简单.两天的电话下来,也有几个意向的 ...

  9. 中兴通讯 软件开发工程师 一二三面

    中兴通讯 软件开发工程师 一面 1.自我介绍 2.谈最熟悉的一个项目,问了挺久的 3.这个项目可以用到什么场景 4.问OSI七层模型的大概作用 5.TCP/IP协议的理解 6.内存分配 7.堆和栈 8 ...

  10. 你为什么选择成为一个程序员,你适合做一个软件开发工程师吗?

    选择一个职业也许有许多理由,那你为什么选择做了一个程序员呢? 作为一个标准的80后老猿,我来说一下自己的亲身体会,也给想入门的小白一个心理评估. 本人开发15余年,随没有太大的建树,但也有自己的些许经 ...

最新文章

  1. php绕后,php函数处理,绕来绕去?
  2. 图解win7下ping命令使用
  3. tomcat架构之-----基本概念
  4. RHEL4安装配置YUM源
  5. 《Linux就该这么学》培训笔记_ch06_存储结构与磁盘划分
  6. LocalDateTime与LocalDate之间的相互转换
  7. MATLAB库函数unwrap(相位解卷绕)的C语言实现
  8. mysql数据库表复用_MySQL 数据库之表操作
  9. python炒股日记_自学python的日记分享
  10. Android版Cocos2d-X应用的AnySDK集成Admob管理库教程
  11. java 解密pdf文件_Java 加密和解密PDF文档
  12. VB mschart控件的使用
  13. html设置分割线虚线,css border设置虚线样式?
  14. C语言洛谷P1957口算练习题
  15. 王者荣耀背景故事整合
  16. Java实现 LeetCode 299 猜数字游戏
  17. 中国酒店周刊 | 上海万信福朋喜来登、包头茂业万豪、武汉江夏万枫酒店开业...
  18. MATLAB画图---设置坐标轴为固定值(以4厘米为例)
  19. 6.1 matlab数值微分与数值积分
  20. 颜色RGB对照表(颜色大全)

热门文章

  1. 主数据管理之二:主数据管理系统的功能组件
  2. linux编译 __stdcall,Linux下的stdcall 约定格式
  3. element ui 前台模板_一个干净优雅的Element UI Admin模板
  4. qt修改文件编码格式
  5. delphi打印pdf文件_在Delphi应用程序中使用Adobe Acrobat(PDF)文件
  6. 专业生物信息linux系统,Evvail | Bio-Linux:生物信息专用Linux系统 | Omics - Hunter
  7. 怎样自学3D建模?能学会吗?
  8. 很认真的聊一聊程序员的自我修养
  9. el-table实现动态表格插入行(开发小记)
  10. 50 个常用 matplotlib 可视化图表