华为OD机试真题.docx

上传人:暗伤 文档编号:16928694 上传时间:2022-05-20 格式:DOCX 页数:145 大小:396.76KB
返回 下载 相关 举报
华为OD机试真题.docx_第1页
第1页 / 共145页
华为OD机试真题.docx_第2页
第2页 / 共145页
点击查看更多>>
资源描述

《华为OD机试真题.docx》由会员分享,可在线阅读,更多相关《华为OD机试真题.docx(145页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1、 【促销活动】题目描述:系统需要提供人民币(CNY)、美元(USD)、英镑(GBP)、港币(HKD) 价值转换功能。为了简单处理,题目的说明和考生调试可以用下面的默认汇率:1 CNY = 2 HKD1 USD = 8 CNY1 GBP = 2 USD请按照汇率实现货币最大兑换和最小兑换功能。例如:最大兑换,即尽量往价值高的货币兑换: Currency(1200, CNY) = 75 GBP Currency(127, HKD) = 3 GBP 1 USD 7 CNY 1 HKD最小兑换,即尽量往价值低的货币兑换,直接转换为多少 HKD 即可。Currency(20, CNY) = 40 H

2、KD汇率是实时变化的,但是短期内大致符合当前价值规律,即相同数值的货币,价值满足 GBPUSDCNYHKD,每组输入数据都会有不同的输入汇率,需要按设置的汇率进行兑换。解答要求时间限制: 1000ms, 内存限制: 64MB 输入示例输入如下:2 8 2 127 HKD MAX(1) 第 1 个数字表示 1CNY 可以换成多少 HKD。(2) 第 2 个数字表示 1USD 可以换成多少 CNY(3) 第 3 个数字表示 1GBP 可以换成多少 USD(4) 第 4 个和第 5 个 表示 数量和货币类型(大写)(5) 第 6 个表示最大兑换(MAX)还是最小兑换(MIN)(6) 需要校验前 4

3、个数字必须是大于 0 的整数。不合法直接返回”ERROR”(7) 货币字母大写简称(HKD、CNY、USD、GBP)、兑换方式字母大写简称(MIN/MAX)需要判断合法性,只有全部字母大写并且内容相同才是合法。(8) 任何其它形式(空缺、大小写不一致、出现负数、小数点、非法字符等)均不合法,直接输出字符串 “ERROR”(9) 每个输入数据为一行,前后无空格,数据之间以 1 个空格间隔(10) 转换代码不需要考虑整数溢出输出输出字符串 “3 GBP 1 USD 7 CNY 1 HKD”(1) 注意输出每组货币都是 数字+空格+货币种类简称(2) 多组不同货币也是以 1 个空格分开,例如 3 G

4、BP 1 USD (3)输出字符串前后没有空格(4) 输出字符串前后没有双引号(“)(5) 若输入不合法直接输出字符串”ERROR”(6) 最大输出时遇到结果为 0 的单位不需要输出。例如输入:2 8 2 17 HKD MAX错误输出:0 GBP 1 USD 0 CNY 1 HKD 正确输出:1 USD 1 HKD样例输入样例 1 复制2 8 2 127 HKD MAX1 6 1 127 HKD max2 8 2 17 HKD MAX输出样例 13 GBP 1 USD 7 CNY 1 HKD ERROR1 USD 1 HKD#include #include #include using na

5、mespace std;int Split(string input, vector& output, string pattern);string MaxExchange(int count, int cnyToHkd, int usdTocny, int gbpTousd);string MinExchange(int count);bool ParamValid(vector param, string& style, string& type, int& cnyToHkd, int& usdTocny, int& gbpTousd, int& count);int main(int a

6、rgc, char* argv)string intput_string;while (getline(cin, intput_string)/ 人民币转港币汇率 美元转人民币汇率 英镑转美元的汇率int cnyToHkd = 2, usdTocny = 8, gbpTousd = 2; int count = 0;string style, type;vector inputArray; Split(intput_string, inputArray, );/ 输入参数转换为对应的值,并做验证if (!ParamValid(inputArray, style, type, cnyToHkd,

7、 usdTocny, gbpTousd, count)cout ERROR endl; continue;/ 将金额全部转换为汇率最小的港币HKD if (style = HKD)/ 港币count = count;else if (style = CNY)/ 人民币count = count * cnyToHkd;else if (style = USD)/ 美元count = count * usdTocny * cnyToHkd;else if (style = USD)/ 英镑count = count * gbpTousd * usdTocny * cnyToHkd;if (type

8、 = MAX)cout MaxExchange(count, cnyToHkd, usdTocny, gbpTousd) endl; continue;cout MinExchange(count) endl;return 0;int Split(string input, vector& output, string pattern)string:size_type pos;input += pattern; /扩展字符串以方便操作for (int i = 0; i input.size(); i+)pos = input.find(pattern, i); if (pos input.si

9、ze()string s = input.substr(i, pos - i); if (s != ) & (!s.empty()output.push_back(s);i = pos + pattern.size() - 1;return 0;string MaxExchange(int count, int cnyToHkd, int usdTocny, int gbpTousd)int gbpCount = count / (cnyToHkd * usdTocny * gbpTousd); / 英镑整数int gbpnext = count % (cnyToHkd * usdTocny

10、* gbpTousd); / 英镑剩余的部分int usdCount = gbpnext / (cnyToHkd * usdTocny);/ 美元整数int usdnext = gbpnext % (cnyToHkd * usdTocny); / 美元剩余的部分int cnyCount = usdnext / (cnyToHkd); / 人民币整数int cnynext = usdnext % cnyToHkd; / 人民币剩余的部分string result;result.append(gbpCount = 0 ? : to_string(gbpCount) + GBP ); result.

11、append(usdCount = 0 ? : to_string(usdCount) + USD ); result.append(cnyCount = 0 ? : to_string(cnyCount) + CNY ); result.append(cnynext = 0 ? : to_string(cnynext) + HKD); return result;string MinExchange(int count)return to_string(count) + HKD;bool ParamValid(vector param, string& style, string& type

12、, int& cnyToHkd, int& usdTocny, int& gbpTousd, int& count)if (param.size() != 6)return false;vector style_vector; style_vector.push_back(GBP); style_vector.push_back(USD); style_vector.push_back(CNY); style_vector.push_back(HKD);vector type_vector; type_vector.push_back(MAX); type_vector.push_back(M

13、IN); cnyToHkd = stoi(param0);usdTocny = stoi(param1); gbpTousd = stoi(param2); count = stoi(param3);/前四个是大于0的整数if (cnyToHkd = 0) | (usdTocny = 0) | (gbpTousd = 0) | (count = 0)return false;bool style_flag = false;for (int i = 0; i style_vector.size(); i+)if (param4 = style_vectori)style_flag = true;

14、if (!style_flag)return false;style = param4;bool type_flag = false;for (int i = 0; i type_vector.size(); i+)if (param5 = type_vectori)type_flag = true;if (!type_flag)return false;type = param5; return true;2、 【拆分输出字符串】题目描述:连续输入字符串(输出次数为 N,字符串长度小于 100),请按长度为 8 拆分每个字符串后输出到新的字符串数组,长度不是 8 整数倍的字符串请在后面补数字

15、 0,空字符串不处理。首先输入一个整数,为要输入的字符串个数。例如:输入:2 abc 12345789输出:abc00000 12345678#include #include #include using namespace std;int main(int argc, char* argv)int N;while (cin N)vectorstring_vector; for (int i = 0; i input;if (!input.empty()string_vector.push_back(input);for (int i = 0; i 8)/只要是字符串长度大于8cout st

16、ring_vectori.substr(0, 8) endl;/从0开始,输出长度为8个字符string_vectori = string_vectori.substr(8);/更新字符串从第8个位置后开始cout string_vectori.append(8 - string_vectori.size(), 0) endl;/调用append函数补0return 0;900000003、 【一个正整数到 Excel 编号之间的转换】题目描述:完成从一个正整数到 Excel 编号之间的转换。用过 excel 的都知道 excel 的列编号是这样的: abc.zaaabac.azbabbbc.

17、yzzazbzc.zzaaaaabaac.分别代表以下编号:123.26272829.52535455.676677678679.702703704705.请写个函数,完成从一个正整数到这种字符串之间的转换。原型:intTranslate(intN,string&ans) 功能:正整数到 Excel 编号字符串转换输入:N输出:ans 返回:0 分析:我的第一感觉是 A,B,C.,Z,AA,AB,AC,.ZZ,AAA,AAB可以转换成“进制数”表示形式,由于一共 26 个英文字母,可以转换成 26 进制表示形式。转换成 26 进制形式后 26 进制数 1 对应A、2 对应B25 对应Y,这样

18、Z 只能对应 26 进制数 10。而十进制数 27 转换成 26 进制数为 11 即可对应成AA,十进制数 52 转换成 26 进制数为 20 对应为AZ。所有#include #include #include using namespace std;int Translate(int N, string& ans)if (N 0)N -= 1;ans += (N % 26) + A); N /= 26;reverse(ans.begin(), ans.end(); return 0;int main(int argc, char* argv)int num; while (1)cin nu

19、m;string str; Translate(num, str); cout str endl;return 0;我们需要对能被 26 整除的正整数进行特殊处理。4、 【字符串简单数据解压缩】题目描述:将一段压缩后的字符串解压缩,并且排序输出解压规则:每个字符串后面跟随一个数字,表示这个字符串的重复次数。例如,“a5”解压缩的结果为“aaaaa”;“abc3”解压缩后的结果为“abcabcabc”。排序规则:1、根据每个字符串的重复次数升序排序,然后输出结果。例如,“a3b2”,输出的结果为“bbaaa”。2、如果字符重复次数一样,则根据ASCII 编码顺序做升序排序,然后输出结果。例如,“

20、b2a2”,输出的结果为“aabb”输入描述:输入的原始字符串仅包含字母和数字输出描述:输出的结果字符串仅包含字母示例 1输入:a11b2bac3bad3abcd2输出:bbabcdabcdbacbacbacbadbadbadaaaaaaaaaaa#include #include #include #include #include using namespace std;typedef struct TypeNvector vector_string;TypeN;int main(int argc, char* argv)string input_string;while (cin inp

21、ut_string)string temp;int len = input_string.size(); int i = 0;int num = 0; int flag = 0;map typen_map; while (i = 0 & input_stringi = 0 & input_stringi = 9 & i len)num = num * 10 + input_stringi - 0;/字符转为10进制数字i+;TypeN string_struct;if (typen_map.find(num) = typen_map.end()/键值对不存在typen_mapnum = str

22、ing_struct;elsestring_struct = typen_mapnum;string mm = ;for (int j = 0; j num; j+)mm += temp;string_struct.vector_string.push_back(mm); typen_mapnum = string_struct;temp = ; num = 0;elsetemp.push_back(input_stringi+);for (int i = 0; i -1; i-)cout sn.vector_stringi;cout endl;return 0;5、 【字符串压缩】通过键盘输

23、入一串小写字母(az)组成的字符串。请编写一个字符串压缩程序, 将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。压缩规则:1. 仅压缩连续重复出现的字符。比如字符串abcbc由于无连续重复字符,压缩后的字符串还是abcbc.2. 压缩字段的格式为字符重复的次数+字符。例如:字符串xxxyyyyyyz压缩后就成为3x6yz#include #include using namespace std;string myZIP(string str);string myZIP(string str)string zip; /aaaabbndaa压缩后a4b2nda2 int n = 1;f

24、or (int i = 0; i str.length(); i+)if (stri = stri + 1)n+;elsestring tmp = to_string(n);/int转string zip += stri;if (n != 1)zip += tmp; n = 1;return zip;int main()string str = ;/压缩后a4b2nda2getline(cin, str);cout myZIP(str) endl; return 0;6、 【搜索矩阵】题目描述:实现一个程序search_matrix(matrix),参数 matrix 是一个仅包含 0 或 1

25、 两种数字的矩阵,程序应返回输入矩阵中包含的最大正方形子矩阵(长和宽相等)的区域面积。例如:如果matrix 是“1010111111”,“000000011”,“1010110111”,“0000110001”,那么它看起来像下面的阵:1010111111000000011110101101110000110001对于上面的输入,最大的子矩阵是一个 3x3 的矩阵,程序只要返回最大子矩阵的面积即可,如上面的矩阵即返回 9(3x3)。输入描述:第 1 行输入为一个数字N,代表下面有几行第 2 行到第N+1 行是代表矩阵的 0 和 1 组成的字符串,每行的长度相同输出描述:返回一个数字,代表输入

26、矩阵的最大正方子矩阵的面积。示例 1输入3110111110输入4#include #include #include using namespace std;int MaxSquare(vectorvector matrix)int len = 0;if (matrix.size() = 0 | matrix0.size() = 0)return 0;/ 创建vectorvector 大小为matrix.size(),里面的每个元素为vector,大小为matrix0.size(),初始值为0vectorvector dp(matrix.size(), vector(matrix0.size

27、(), 0); for (int i = 0; i matrix.size(); +i)for (int j = 0; j N)vectorvector matrix; for (int i = 0; i input;vector char_vec;for (int j = 0; j input.size(); j+)char_vec.push_back(inputj);matrix.push_back(char_vec);cout MaxSquare(matrix) endl;return 0;7、 【猴子吃桃】题目描述:孙悟空喜欢吃蟠桃,一天他乘守卫蟠桃园的天兵天将离开了而偷偷的来到王母娘

28、娘的蟠桃园偷吃蟠桃。已知蟠桃园有N 棵蟠桃树,第i 棵蟠桃树上有Ni(大于 0) 个蟠桃,天兵天将将在H(不小于蟠桃树棵数)小时后回来。孙悟空可以决定他吃蟠桃的速度K(单位:个/小时),每个小时他会选则一颗蟠桃树,从中吃掉 K 个蟠桃,如果这棵树上的蟠桃数小于K,他将吃掉这棵树上所有蟠桃,然后这一小时内不再吃其余蟠桃树上的蟠桃。孙悟空喜欢慢慢吃,但仍想在天兵天将回来前将所有蟠桃吃完。求孙悟空可以在H 小时内吃掉所有蟠桃的最小速度K(K 为整数)。输入描述从标准输入中读取一行数字,前面数字表示每棵数上蟠桃个数,最后的数字表示天兵天将将离开的时间。输出描述吃掉所有蟠桃的最小速度K(K 为整数)或输

29、入异常时输出-1。示例 1输入:3 11 6 7 8输出:4思路1. 输入如果不是正整数则报错,定义一个字符串类型 n,先判断n 是不是只含数字,如果不是,则输出-12. 判断输入是否含 0,我们可以通过字符串变整数得到变量a,如果桃子树上为 0 颗果子,那么肯定异常嘛,输出-13. 在输入正常的情况下,要判断有没有桃树。如果没有桃树,则数组 res 只有一个值,那么异常4. 除猴子吃的限定小时外,对其他的树上果子进行排序,因为猴子最多吃桃树上果子最多的那颗树,多了就不符合题意最少,是不是,所以猴子 1 小时内吃的范围k 在 1 到桃树上最多果子数5. 下面就是遍历 k 的范围啦,判断吃每颗树

30、要的时间加起来就是总时间小于等于规定时间,则符合题意了。如果在遍历范围内,没有符合题意的则输出-1 啦#include #include #include #include using namespace std; bool IsNormal(string str)for (int i = 0; stri != 0; i+)if (stri 9)return false;return true;int Split(string input, vector& output, string pattern)string:size_type pos;input += pattern; /扩展字符串以

31、方便操作for (int i = 0; i input.size(); i+)pos = input.find(pattern, i); if (pos input.size()string s = input.substr(i, pos - i); if (s != ) & (!s.empty()output.push_back(s);i = pos + pattern.size() - 1;return 0;int main(int argc, char* argv)string input_string;while (getline(cin, input_string)vector re

32、sult; vector numbers; bool flag = true; numbers.clear();Split(input_string, numbers, );for (int i = 0; i numbers.size(); i+)if (!IsNormal(numbersi)flag = false;cout -1 endl; break;elseint temp = atoi(numbersi.c_str(); if (temp = 0)flag = false; cout -1 endl; break;elseresult.push_back(temp);if (flag

33、)if (result.size() = 1)flag = false; cout -1 endl;if (flag)int k = 1;sort(result.begin(), result.end() - 1); bool normal = false;while (k = resultresult.size() - 2)int count = 0;for (int i = 0; i result.size() - 1; i+)if (resulti % k = 0)count += resulti / k;elsecount += resulti / k + 1;if (count =

34、resultresult.size() - 1)normal = true; cout k endl; break; k+;if (!normal)cout -1 endl;return 0;8、 【水果搬运问题】一组工人搬运一批水果,用一维数组存储工人编号和水果名称以及搬运重量,要求先按水果分组,然后按搬运重量排序输出。输入描述:第一行包括一个整数N(1N100),代表工人的个数。接下来的 N 行每行包括两个整数 p 和 q,分别代表每个工人的编号和搬运重量,以及一个字符串m,代表水果的名称。输出描述:先按水果分组,然后按工人的搬运重量从小到大进行排序,并将排序后的信息打印出来。如果工人搬运

35、的重量相同,则按照编号的大小从小到大排序,并且要求水果的输出次序同输入次序。示例 1 输入 5Apple 1 80Apple 2 62Apple 4 73Orange 4 65Orange 1 90Apple 3 91Orange 3 88Orange 5 90输出Apple 2 62Apple 4 73Apple 1 80Apple 3 91Orange 4 65Orange 3 88Orange 1 90Orange 5 90#include #include #include #include #include using namespace std;bool Compare(pair&

36、 a, pair& b)if (a.second != b.second)return a.second b.second;elsereturn a.first b.first;int main(int argc, char* argv)mapstring, vectorpair mapTest; int N;while (cin N)mapTest.clear();string name; int id, weight;for (int i = 0; i name id weight; mapTestname.push_back(pair(id, weight);for (auto it =

37、 mapTest.begin(); it != mapTest.end(); it+)sort(it-second.begin(), it-second.end(), Compare); for (int i = 0; i second.size(); i+)cout first secondi.first secondi.second endl;return 0;#include #include #include #include #include using namespace std;typedef struct FruitTransportstring name; int id;in

38、t weight;FruitTransport;bool Compare(FruitTransport& a, FruitTransport& b)if (a.name != b.name)return a.name b.name;else if (a.weight != b.weight)return a.weight b.weight;elsereturn a.id = b.id;int main(int argc, char* argv)vector vector_struct; int N;while (cin N)vector_struct.clear();string name;

39、int id, weight;for (int i = 0; i name id weight; ft.name = name;ft.id = id; ft.weight = weight;vector_struct.push_back(ft);vector:iterator it = vector_struct.begin();sort(vector_struct.begin(), vector_struct.end(), Compare);for (auto it = vector_struct.begin(); it != vector_struct.end(); it+)cout name id

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁