华为上机题汇总(六)
来源:互联网 发布:怎么面试美工 编辑:程序博客网 时间:2024/06/05 00:00
华为上机题汇总(六)
注:编译环境为Visual Studio 2012,答案仅供参考。
目录
- 华为上机题汇总六
- 目录
- 第二十六题
- 第二十七题
- 第二十八题
- 第二十九题
- 第三十题
第二十六题
26.一副牌中发五张扑克牌给你:让你判断数字的组成:
有以下几种情况:
1:四条:即四张一样数值的牌(牌均不论花色)2:三条带 一对
3:三条带两张不相同数值的牌
4:两对
5:顺子 包括 10,J,Q,K,A
6:什么都不是
7:只有一对
#include <iostream>#include <vector>#include <algorithm>#include <string>using namespace std;bool cmp(const int &a, const int &b){ return a > b;}int judge(vector<int> v){ sort(v.begin(),v.end()); vector<int> flags(5,0); auto begin = v.begin(); while (begin != v.end()) { auto ahead = begin + 1; while (ahead != v.end() && *ahead == *begin) { ahead++; } int flag = ahead - begin; flags.push_back(flag); begin = ahead; } sort(flags.begin(),flags.end(),cmp); switch (flags[0]) { case 4: return 1; case 3: switch (flags[1]) { case 2: return 2; case 1: return 3; default: break; } break; case 2: switch (flags[1]) { case 2: return 4; case 1: return 7; default: break; } break; default: break; } for (int i = 0; i < 4; i++) { if (v[i] != v[i+1]-1) { return 6; } } return 5;}int main(){ vector<int> v; string s; getline(cin,s); auto begin = s.begin(); while (begin != s.end()) { auto ahead = begin + 1; while (ahead != s.end() && *ahead != ' ' && *ahead != ',') { ahead++; } string tmp(begin,ahead); int num; if (tmp == "J") { num = 11; } else if (tmp == "Q") { num = 12; } else if (tmp == "K") { num = 13; } else if (tmp == "A") { num = 14; } else { num = stoi(tmp); } v.push_back(num); if (ahead == s.end()) break; begin = ++ahead; } cout << judge(v) << endl; return 0;}
第二十七题
27.高精度整数加法
问题描述:
在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中,
参与运算的操作数和结果必须在-2^31 ~ 2^31-1之间。如果需要进行更大范围的十进制整数加法,需要使用特殊
的方式实现,比如使用字符串保存操作数和结果,采取逐位运算的方式。如下:
9876543210 + 1234567890 = ?
让字符串 num1=”9876543210”,字符串 num2=”1234567890”,结果保存在字符串 result = “11111111100”。
-9876543210 + (-1234567890) = ?
让字符串 num1=”-9876543210”,字符串 num2=”-1234567890”,结果保存在字符串 result = “-11111111100”。
要求编程实现上述高精度的十进制加法。
要求实现函数:
void add (const char *num1, const char *num2, char *result)
【输入】num1:字符串形式操作数1,如果操作数为负,则num1[0]为符号位’-’
num2:字符串形式操作数2,如果操作数为负,则num2[0]为符号位’-’
【输出】result:保存加法计算结果字符串,如果结果为负,则result[0]为符号位。
注:
I、 当输入为正数时,’+’不会出现在输入字符串中;当输入为负数时,’-‘会出现在输入字符串中,且一定在输入字符串最左边位置;
II、 输入字符串所有位均代表有效数字,即不存在由’0’开始的输入字符串,比如”0012”, “-0012”不会出现;
III、 要求输出字符串所有位均为有效数字,结果为正或0时’+’不出现在输出字符串,结果为负时输出字符串最左边位置为’-‘。
#include <iostream>#include <string>using namespace std;//computeType 0:加法 1:减法。large 1:num1绝对值大于等于num2。resultType 0表示结果为正,1表示为负void judge(string &num1, string &num2, bool &computeType, bool &large, bool &resultType){ bool flag1 = num1[0] == '-' ? 1 : 0; bool flag2 = num2[0] == '-' ? 1 : 0; computeType = flag1 ^ flag2; if (flag1) num1.erase(num1.begin()); if (flag2) num2.erase(num2.begin()); if (num1.size() > num2.size()) large = 1; else if (num1.size() < num2.size()) large = 0; else { for (unsigned i = 0; i < num1.size(); i++) { if (num1[i] > num2[i]){ large = 1; break; } else if (num1[i] < num2[i]) { large = 0; break; } } } resultType = large ? flag1 : flag2;}string compute(const string &s1, const string &s2, bool computeType, bool resultType){ string s3; int over = 0; auto b1 = s1.rbegin(), b2 = s2.rbegin(); while (b1 != s1.rend() && b2 != s2.rend()) { int value1 = (*b1++) - '0'; int value2 = (*b2++) - '0'; int result = computeType ? value1-value2+over : value1+value2+over; if (result < 0) { over = -1; result += 10; } else { over = result/10; result %= 10; } s3.push_back(result + '0'); } while (b1 != s1.rend()) { int value1 = (*b1++) - '0'; int result = computeType ? value1+over : value1+over; if (result < 0) { over = -1; result += 10; } else { over = result/10; result %= 10; } s3.push_back(result + '0'); } s3.push_back(over + '0'); auto pos = s3.find_last_not_of("0"); s3.erase(s3.begin()+pos+1,s3.end()); for (unsigned i = 0; i < s3.size()/2; i++) { char tmp = s3[i]; s3[i] = s3[s3.size()-i-1]; s3[s3.size()-i-1] = tmp; } if (resultType) s3.insert(s3.begin(),'-'); return s3;}void add (const char *num1, const char *num2, char *result){ string s1(num1, strlen(num1)); string s2(num2, strlen(num2)); bool computeType,resultType,large = 1; judge(s1,s2,computeType,large,resultType); string s3 = large ? compute(s1,s2,computeType,resultType) : compute(s2,s1,computeType,resultType); for (unsigned i = 0; i < s3.size(); i++) { result[i] = s3[i]; } result[s3.size()] = '\0';}int main(){ char num1[255],num2[255],result[256]; cin.getline(num1,255); cin.getline(num2,255); add(num1,num2,result); cout << result << endl; return 0;}
第二十八题
28.单词迷宫
题目简介:
Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉。如上图,假设给定单词if,你必须先吃掉i然后才能吃掉f。
但现在你的任务可没有这么简单,你现在处于一个mí宫Maze(n×m的矩阵)当中,里面到处都是以字母标注的食物,但你只能吃掉能连成给定单词W的食物。
如下图,指定W为“SOLO”,则在地图中红色标注了单词“SOLO”。
注意区分英文字母大小写,你只能上下左右行走。
运行时间限制: 无限制
内存限制: 无限制
输入:
输入第一行包含两个整数n、m(0<n, m<21)
分别表示n行m列的矩阵,第二行是长度不超过100的单词W,从第3行到底n+3行是只包含大小写英文字母的长度为m的字符串。
输出:
如果能在地图中连成给定的单词,则输出“YES”,否则输出“NO”。注意:每个字母只能用一次。
样例输入:
5 5
SOLO
CPUCY
EKLQH
CRSOL
EKLQO
PGRBC
样例输出:yes
#include <iostream>#include <vector>#include <string>using namespace std;bool canVisit(int row, int col, int n, vector<int> hasVisited){ int index = row * n + col; for(auto begin = hasVisited.begin();begin != hasVisited.end();begin++){ if (index == *begin) { return false; } } return true;}bool hasWay(int row, int col, int n, int m, string::iterator word, vector<string> maze, vector<int> hasVisited, string &s){ if (++word == s.end()) return true; bool flagUp = false, flagDown = false, flagLeft = false, flagRight = false; if (row > 0 && maze[row-1][col] == *word && canVisit(row-1,col,n,hasVisited)) { hasVisited.push_back((row-1) * n + col); flagUp = hasWay(row-1,col,n,m,word,maze,hasVisited,s); } if (row < n-1 && maze[row+1][col] == *word && canVisit(row+1,col,n,hasVisited)) { hasVisited.push_back((row+1) * n + col); flagDown = hasWay(row+1,col,n,m,word,maze,hasVisited,s); } if (col > 0 && maze[row][col-1] == *word && canVisit(row,col-1,n,hasVisited)) { hasVisited.push_back(row * n + col-1); flagLeft = hasWay(row,col-1,n,m,word,maze,hasVisited,s); } if (row < m-1 && maze[row][col+1] == *word && canVisit(row,col+1,n,hasVisited)) { hasVisited.push_back(row * n + col+1); flagRight = hasWay(row,col+1,n,m,word,maze,hasVisited,s); } return flagUp || flagDown || flagLeft || flagRight;}bool wordGame(int n, int m, string::iterator word, vector<string> maze, string &s){ vector<int> hasVisited; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (maze[i][j] == *word) { hasVisited.push_back(i*n+j); bool flag = hasWay(i,j,n,m,word,maze,hasVisited,s); if (flag) return true; } } } return false;}int main(){ int n,m; cin >> n >> m; string s; cin >> s; vector<string> maze; for (int i = 0; i < n; i++) { string tmp; cin >> tmp; maze.push_back(tmp); } cout << (wordGame(n,m,s.begin(),maze,s) ? "yes" : "no") << endl; return 0;}
第二十九题
29.10个学生考完期末考试评卷完成后,A老师需要划出及格线,要求如下:
(1) 及格线是10的倍数;
(2) 保证至少有60%的学生及格;
(3) 如果所有的学生都高于60分,则及格线为60分
#include <iostream>using namespace std;int countAboveScore(int nums[10], int score){ int count = 0; for (int i = 0; i < 10; i++) { if (nums[i] >= score) { count++; } } return count;}int caculatePassline(int nums[10]){ int line = 0; for (int i = 0; i <= 60; i += 10) { if (countAboveScore(nums, i) >= 6) { line = i; } } return line;}int main(){ int nums[10]; for (int i = 0; i < 10; i++) { cin >> nums[i]; } cout << caculatePassline(nums) << endl; return 0;}
第三十题
30.
一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。
有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。
注:电灯数和学生数一致。
#include <iostream>using namespace std;int main(){ int n; cin >> n; //约数个数为奇数的灯亮着,为偶数的灯灭。只有平方数的约数为奇数! int result = sqrt((double)n); cout << "亮着的灯盏数为:" <<result << endl; cout << "亮着的灯号码为:"; for (int i = 1; i <= result; i++) { cout << i*i << " "; } cout << endl; return 0;}
- 华为上机题汇总(六)
- 华为上机题汇总
- 华为上机题汇总(一)
- 华为上机题汇总(二)
- 华为上机题汇总(三)
- 华为上机题汇总(四)
- 华为上机题汇总(五)
- 华为上机题汇总(七)
- 华为上机题汇总(八)
- 华为上机题汇总(九)
- 华为上机题汇总(十)
- 华为上机题汇总(十一)
- 华为上机题汇总(十二)
- 华为上机题汇总(十三)
- 华为上机题汇总(十四)
- 华为上机题汇总(十五)
- 华为上机题汇总(十六)
- 华为上机题汇总(十七)
- elasticsearch源码分析之启动过程(二)
- Barber of the Army of Mages
- 编写Nginx启停服务脚本
- 225. Implement Stack using Queues
- Pattern用法(正则表达式)
- 华为上机题汇总(六)
- MTK MT6169 clock buffer XO3输出控制方法
- MVC5 新建项目里不包含jquery.unobtrusive-ajax.js 解决办法
- CentOS全自动一键安装PHP,MySQL,phpmyadmin与Nginx
- java高级开发学习之--反射机制(2)
- leetcode No93. Restore IP Addresses
- (2016 Multi) physics hdu 5826
- Lock Mode Type 之 Optimistic 使用场景
- java旅行第二站--javaSE第9天--服务器端与客户端之间互相通信