华为机试样题


记票统计
描述:

模拟n个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用“A”、”B”、”C”、”D”表示,选举时开始计票, 若输入的不是“A”、”B”、”C”、”D”则视为无效票。选举结束后获取各个候选人的得票数以及无效票的个数,输出结果以添加候选人的顺序进行顺序输出,最后一行为无效的数量。同时getVoteResult命令为结束命令。

运行时间限制: 无限制
内存限制: 无限制
输入:

输入为多行形式输入,每一行为一条命令。输入的命令只会是有效命令不会有非法命令,但可能存在非法的投票,上面已经描述了。

添加候选人的命令如下:addCandidate为命令 xx1为候选人

addCandidate xx1

投票的命令如下:vote为命令 xx1为候选人的字符串

vote xx1

统计投票的命令如下:getVoteResult为命令

getVoteResult

输出:

输出结果以添加候选人的顺序进行顺序输出,最后一行为无效的数量。

样例输入:
addCandidate xx1
addCandidate xx2
addCandidate xx3
addCandidate xx4
addCandidate xx5
addCandidate xx6
vote xx1
vote xx3
vote xx4
vote xx1
vote xx2
vote xx7
vote xx4
vote xx5
vote xx3
vote xx2
vote xx1
vote xx7
getVoteResult
样例输出:
xx1 3
xx2 2
xx3 2
xx4 2
xx5 1
xx6 0
2
答案提示:

 


#include<iostream>
#include<string>
#include<map>
#include<vector>
using namespace std;
int main()
{
	string s;

	while (getline(cin, s))
	{
		vector<string>cand;
		map<string, int>cnt;
		int va = 0;
		string na1 = string(s.begin() + 13, s.end());
		cand.push_back(na1);
		cnt[na1] = 0;
		while (s != "getVoteResult")
		{
			while (getline(cin, s))
			{
				if (s == "getVoteResult")
					break;
				int pos = s.find("addCandidate");
				if (pos != string::npos)
				{
					string na = string(s.begin() + 13, s.end());
					cand.push_back(na);
					cnt[na] = 0;
				}
				else
				{
					pos = s.find("vote");
					if (pos != string::npos)
					{
						string na = string(s.begin() + 5, s.end());
						if (cnt.find(na) != cnt.end())
							cnt[na]++;
						else
							va++;
					}
				}
			}
		}
		for (int i = 0; i<cand.size(); i++)
			cout << cand[i] << " " << cnt[cand[i]] << endl;
		cout << va << endl;
	}
	return 0;
}



计算麻将的番数

麻将游戏越来越受到大家喜爱,也在网络上盛行。本题目是给定一组已经和牌的麻将,编写一个函数计算这组麻将的番数。为简化题目,假设麻将只有筒子和条子两种花型,能翻番的规则也只有以下三种,当一组牌中没有下述三种情况中的一种或多种,则这组牌为0番,每种番数是加的关系,例如一组牌既有卡2条又有四归一,则番数为3番。

1.2条为一番,即有一局牌是 123条;

2.四归一为两番,即有4张一样的牌(花色和数字都一样);

3.巧七对为两番,即一组牌恰好是7对牌;

  一些约定:

1.一组已经和牌的麻将由多局牌组成,一局牌可以是一对牌、3张连续同样花色的牌、3张一样的牌、4张一样的牌。

2.一组已经和牌一般有14张牌,最多可以有18张牌(当有四归一的时候)

 

运行时间限制: 无限制
内存限制: 无限制
输入:

一字符串表示已经和牌的麻将(由输入者保证,编程人员无需考虑没有和牌),如1T2T3T,4T5T6T,7T8T9T,1D2D3D,4D4D.

说明:

1.”1T”表示1条,T表示条子,前面跟数字几表示几条,数据范围19,输入者保证,编程无需考虑输入规范性;

     2.”4D”表示4筒,D表示筒子,前面跟数字几表示几筒,数据范围是19, 输入者保证,编程无需考虑输入规范性;

     3.每局牌之间由’,’隔开,输入者保证每局牌都是正确的且按照数字由小到大排序,编程人员无需判断每局牌的正确性;

     4.一组牌以’.’号结束,由输入者保证,编程人员无需考虑是否有”.”号。

   5.输入保证有番数的牌在一局中,编程人员无需考虑排序,即有番数的牌不会分散在多局牌中。

 

输出:

麻将的番数,整型类型。

 

样例输入:
1T2T3T,4T5T6T,7T8T9T,1D2D3D,4D4D.
样例输出:
1
答案提示:

只输出番数,且为整型。





  Word Maze 是一个网络小游戏,你需要找到以字母标注的食物,但要求以给定单词字母的顺序吃掉。如上图,假设给定单词if,你必须先吃掉i然后才能吃掉f。


    但现在你的任务可没有这么简单,你现在处于一个迷宫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<string>
#include<vector>
#include<algorithm>
using namespace std;

void search(vector<vector<pair<int, int>>>&cand, vector<string>&maze, string target, bool&flag)
{
	vector<vector<pair<int, int>>>newcand;
	int xx[4] = { 0, 0, -1, 1 };
	int yy[4] = { -1, 1, 0, 0 };
	for (int i = 0; i < cand.size() && !flag; i++)
	{
		int y(cand[i].back().first), x(cand[i].back().second);
		for (int j = 0; j < 4 && !flag; j++)
		{
			if (x + xx[j] >= 0 && x + xx[j] < maze[0].length() && y + yy[j] >= 0 && y + yy[j] < maze.size())
				if (maze[y + yy[j]][x + xx[j]] == target[cand[i].size()] &&
					find(cand[i].begin(), cand[i].end(), pair<int, int>(y + yy[j], x + xx[j])) == cand[i].end())
				{
					if (cand[i].size() == target.length() - 1)
						flag = true;
					else
					{
						vector<pair<int, int>>aa = cand[i];
						aa.push_back(pair<int, int>(y + yy[j], x + xx[j]));
						newcand.push_back(aa);
					}
				}
		}
	}
	cand = newcand;
}


int main()
{
	int n, m;
	while (cin >> n >> m)
	{
		string target;
		cin >> target;
		vector<string>maze;
		for (int i = 0; i<n; i++)
		{
			string s;
			cin >> s;
			maze.push_back(s);
		}
		bool flag = false;
		for (int i = 0; i<n&&!flag; i++)
			for (int j = 0; j<m&&!flag; j++)
				if (maze[i][j] == target[0])
				{
					vector<pair<int, int>>aa;
					aa.push_back(pair<int, int>(i, j));
					vector<vector<pair<int, int>>>bb;
					bb.push_back(aa);
					while (!bb.empty())
						search(bb, maze, target, flag);

				}
		if (flag)
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
	}
	return 0;
}



对数计数器
描述:

小明在使用一个计数器,计数范围0~999999,小明第一次看计数器的时候,其读数为一个对数(即正反读是一样的,如12321),当出现下一个对数的时候,小明停止了计数。
输入小明看到的第一个对数,请输出计数数量(即第二个对数跟第一个对数的差值)。注意,计数器达到999999后,会重新从0开始。

运行时间限制: 无限制
内存限制: 无限制
输入:

输入一个整数0~999999

输出:

输出计数数量,非负整数

样例输入:
123321
样例输出:
1100
答案提示:

 





实现两个合法时间相加
描述:

给定两个合法的时间(格式固定:hh:mm:ss,时间合法,不用考虑其它情况),输入两个时间相加后的结果;注意,相加后的结果也必需是一个合法的时间;
附合法时间定义:小时在[00-23]之间,分钟和秒分别是在[00-59]之间;

运行时间限制: 无限制
内存限制: 无限制
输入:

时分秒格式的时间字符串,如00:00:00

输出:

时分秒格式的时间字符串,如00:00:00

 

样例输入:
00:00:00 00:00:01
样例输出:
00:00:01
答案提示:

建议将时间转换为秒数计算





计算电梯运送完n(1<=n<=100)个乘客的耗时
描述:

描述:计算电梯运送完n(1<=n<=100)个乘客的耗时。说明:

(1)电梯每上升或下降一层耗时1;

(2)电梯允许的最大乘客数量为m(1<=m<=10);

(3)楼层最大高度为10层,电梯初时位置在1层;

(4)电梯按照乘客请求先后顺序来处理;特殊情况除外:电梯运行过程中,遇到乘客上下楼方向和电梯运行方向一致,乘客目的地介于等于电梯目的地,且电梯未达到最大乘客数,顺带处理该乘客请求;比如电梯正在处理乘客1的请求(从1楼到5楼),往上运行到2楼有乘客2(从2楼到3楼),则顺带处理乘客2请求;电梯空载从1层前往处理乘客1的请求(丛3楼到5楼),此时电梯目的地是3楼,往上运行到2楼有乘客2(丛2楼到4楼),则不能顺带处理乘客2请求。

(5)同一层乘客进入电梯的优先级是按照乘客请求先后来决定的,请求越早,优先级越高;电梯是先下后上。

(6)乘客进入电梯和离开电梯不耗时;

编程实现,输入m、n、和n个乘客信息(乘客所在楼层和乘客目的楼层),输出电梯运送完n个乘客的耗时。 比如:输入:2  3  3  5  4  2  1  3,表示电梯允许的最大乘客数量为2,有3个客户,首先请求的乘客1所在楼层为3楼,目的楼层是5楼,其次请求的乘客2所在楼层为4楼,目的楼层为2楼, 最后请求的乘客3所在楼成为1楼,目的楼成为3楼;电梯首先响应乘客1的请求,且能够顺带处理乘客3的请求,因此处理完乘客1和乘客3耗时为4;接着电梯处理乘客2的请求,又耗时3;总耗时为7,输出7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

运行时间限制: 10 Sec
内存限制: 10 MByte
输入:

输入电梯允许的最大乘客数量、乘客数、和乘客信息(乘客所在楼层和乘客目的楼层)

输出:

电梯运送完乘客的耗时

样例输入:
2  3  3  5  4  2  1  3
样例输出:
7
答案提示:

 






在二叉树中找出和为某一值的所有路径
描述:

请写一个程序创建一棵二叉树,并按照一定规则,输出二叉树根节点到叶子节点的路径。

规则如下:
1、从最顶端的根结点,到最下面的叶子节点,计算路径通过的所有节点的和,如果与设置的某一值的相同,那么输出这条路径上的所有节点。

2、从根节点遍历树时,请请按照左到右遍历,即优先访问左子树的节点。


二叉树创建规则:从上到下一层一层的,按照从左到右的顺序进行构造

输入"10,5,12,4,7"值,构造的树如下:

1)    10


2)    10
       /
      5
      
3)    10
       /\
      5  12
 
4)    10
       /\
      5  12 
     /
    4     
      
5)    10
       /\
      5  12 
     /\
    4  7

针对上面的二叉树,如果当前我们设置的“路径和”为19,那么输出结果为:

10,5,4

如果有多个路径,按到左到右的顺序遍历生成的结果每行显示一个显示。例如如果当前我们设置的“路径和”为22,那么输出结果为:

10,5,7

10,12

如果没有找到路径和为设置的值的路径,输出error。

 

 

运行时间限制: 无限制
内存限制: 无限制
输入:

输入整数N---路径和

一行字符串,多个正整数,之间用","隔开

 

输出:

满足条件的二叉树路径

 

样例输入:
22

10,5,12,4,7
样例输出:
10,5,7
10,12
答案提示:

 




高次方位数
描述:

用户输入两个非负整数x、y,其中y<100,求x的y次方结果的最后三位数。

运行时间限制: 无限制
内存限制: 无限制
输入:

两个非负整数


输出:

x的y次方结果的最后三位数;如果结果不足三位,前面补0.

样例输入:
32 2
样例输出:
024
答案提示:






模拟触摸屏的手势判断
描述:

如今电子产品触摸屏非常普及,触摸屏最重要的特点是要感知用户的手势,如,感知手指是向上下左右哪个方向滑动。

请编写程序,输入用户手势轨迹上两个点坐标x1,y1和x2,y2,输出表示手势方向字符串(UP,DOWN,LEFT或者RIGHT),如果两点坐标相同,则输出字符串CLICK,表示是点击操作。

假设屏幕左上角为坐标原点(0, 0),横向为x坐标,竖向为y坐标,输入4个数字以空格隔开。如果手势刚好是45度角方向,则根据x坐标方向判定为LEFT或者RIGHT。    

运行时间限制: 无限制
内存限制: 无限制
输入:

输入两个点坐标x1 y1 x2 y2

输出:

输出表示手势的字符串UP,DOWN,LEFT,RIGHT或CLICK(大写)

样例输入:
10 10 20 30
样例输出:
DOWN
答案提示:

 







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值