华为机试网测题目总结2014/9/12提前批

本文总结了2014年9月12日华为机试的三道题目,包括字符串处理、文件夹操作和动态规划问题。作者提供了代码示例,并分享了如何准备和应对华为机试的心得,强调基础扎实和心态的重要性。
摘要由CSDN通过智能技术生成

       年年招聘都几乎走在最前面的华为,在今天机试了,总体来说难度不大,但是要通过也不是随随便便就能过的,总要准备一番,先将今天的机试题目和解决代码与运行效果说一下。

       然后再给出怎么过华为机试和网测心得的总结吧。需要机试的童鞋可以认真看看。


第一题:将一串字符串中的大写字母找出,原有空格保留,并按原有格式输出,如果原字符串中相邻两个大写字母有两个或两个以上的空格按照一个输出。

输入样例:AUStralia;

输出样例:AUS

输入样例:He Is a DoG

输出样例:H I  DG

分析:通常来说第一题比较基础,基本(有一定基础才可拿满分)属于送分的。但是此题也有坑,第一是输入带空格的字符串应该怎么解决;第二个是连续的空格处理,其他的都很基础。另外需要注意的不管什么题,一定按照出题人的输出格式显示结果,否则机试判题结果同样是0分!!(比如平时为了好看,或是习惯会在最后cout<<endl;这在机试中有可能会造成判零分的结果)

现将代码放在下面:

#include "iostream"
#include "string"
using namespace std;

int main()
{
	char s[100];
	int j=0;
	char c[100]={'0'};
	gets(s);
	int len=strlen(s);
	int f=0;
	
	for (int i=0;i<len;i++)
	{
		if((s[i]>='A'&&s[i]<='Z')||s[i]==' ')
		{
			c[j]=s[i];
			j++;
		}
		else
			continue;
	}
	for (int i=0;i<j;i++)
	{
		if (c[i]==' ')
		{
			if (f==0)
			{
				cout<<c[i];
				f=1;
			}	
			else
				continue;
		}
		else
		{
			cout<<c[i];
			f=0;
		}
	}
	return 0;
}
运行结果如下:

第二题:一个文件夹可以加入文件,binding 20;也可以摘除文件,remove 10;如果摘除文件数目大于加入文件数目,则显示文件夹文件数目为current 0;当输入end结束命令时显示当前文件个数。(大体意思这样,数字可能有出入)

输入样例:binding 20

                  remove 10

                  binding 30

                  remove 10

                  end

输出样例:current 30

分析:这道题目和之前熟悉机试环境的投票题目有异曲同工之妙,主要就是通过输入字符串的命令来进行相应的操作处理,关键在于怎么构建这个命令系统,其实很简单,用一个while(1)循环就可以了。

代码如下:

#include "iostream"
#include "string"
using namespace std;

int main()
{
	string s;
	int num;
	int current_cnt=0;

	while (1)
	{
		cin>>s;
		if (s=="binding")
		{
			cin>>num;
			current_cnt+=num;
		}
		else if (s=="remove")
		{
			cin>>num;
			if (num>=current_cnt)
			{
				current_cnt=0;
			}
			else
				current_cnt-=num;
		}
		else if (s=="end")
		{
			cout<<"current"<<" "<<current_cnt;
			return 0;
		}
	}
}
运行结果如下:


第三题:有一些难度,题意大体为:有七个和尚,每个和尚能挑水的日子不一样,如第一个和尚星期二、星期四能挑水;第二个和尚星期一、星期六能挑水;第三个和尚星期三、星期日能挑水;第四个和尚星期五能挑水;第五个和尚星期一、星期四、星期六能挑水;第六个和尚星期二、星期五能挑水;第七个和尚星期三、星期六、星期日能挑水。用一个7x7数组表示和尚能否挑水,能挑水为1,不能挑水为0,每个和尚的编号依次为1到7,现在规划一周的挑水值日表,并按和尚的序号升序安排(加入某一天能挑水的和尚有两个,则按照这两个和尚的编号由小到大安排),输出方案的个数,并将每个方案按照和尚序号排列出来。

输入样例:0 1 0 1 0 0 0

                  1 0 0 0 0 1 0

                  0 0 1 0 0 0 1

                  0 0 0 0 1 0 0

                  1 0 0 1 0 1 0

                  0 1 0 0 1 0 0

                  0 0 1 0 0 1 1

输出样例:4

                  2 6 3 1 4 5 7

                  2 6 7 1 4 5 3

                  5 6 3 1 4 2 7

                  5 6 7 1 4 2 3 

分析:第三道题目还是有一些难度的,这就要靠平时的积累了。这道题主要是考虑用动态规划的思想来解决问题,关于什么是动态规划可以看一篇动态规划的入门指导:点击打开链接

下面上这道题目的代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int input[7][7]={{0}};
int res[5040][7]={{0}};
int num=0;

void next(int *temp,int i) // check zhou i
{
	int t[7]={0};
	int check=0;
	if (i>=7)
	{
		for(int ii=0;ii<7;ii++)
			res[num][ii] = temp[ii];
		num++;
		return;
	}
	for(int ii=0;ii<7;ii++)
		t[ii] = temp[ii];
	for (int ii=0;ii<7;ii++)
	{
		if (input[ii][i] == 1)
		{
			for(check=0;check<i;check++) //check if "ii" used
			{
				if (t[check] == ii)
					break;
			}
			if (check == i) //"ii" not used
			{
				t[i] = ii;
				next(t,i+1);
			}
		}
	}
}
int main()
{
	int temp[7]={0};
	int i=0,j=0,k=0;
	for (i=0;i<7;i++)/
		for (j=0;j<7;j++)
			scanf("%d",&input[i][j]);

	next(temp,0);
	printf("%d\n",num);
	for (int ii=0;ii<num;ii++)
	{
		printf("%d %d %d %d %d %d %d",res[ii][0]+1,res[ii][1]+1,res[ii][2]+1,res[ii][3]+1,res[ii][4]+1,res[ii][5]+1,res[ii][6]+1);
		if (ii!=num-1)
			printf("\n");
	}

	return 0;
}
运行结果如下:



看完三道题目有何感想呢?其实除了第三道题目,其他的都比较基础,平时多上手练习总没问题的,而且小道消息说只要完整做出一道就可以过了(此观点仅供参考,无任何官方依据),所以担心什么呢?下面总结下怎么过华为机试的心得体会吧。

       对于机试,除了长期积累的软件基本功以外,还有很多可以短期训练的东西,类似于考试之前的突击,可以迅速提高机试成绩。

       (1)首先应该调整好自己的心态,不要觉得写程序很难,机试题很难,也不要去考虑,万一机试考到自己不会的内容怎么办,要相信,机试题永远是考察每个人的基础,基础是不会考的很偏的,会有人恰好做过某个题而做出来那个题,但不会有人恰好没做过一个题而做不出来那个题。

       (2)调整好心态,时刻告诉自己,哪些小错误是自己以前经常犯的,最好用笔记本记录下来,写每道题前再看一遍,如果遇到代码调不出来了,先想想自己是否犯过以前那些错误。还有就是,看了题目以后,先仔细想清楚细节(这个很重要,首先将思路理清了再动手),在纸上写清楚自己需要用到的变量,以及代码的基本框架,不要急于动手去写代码。

       (3)不要惧怕任何一道看起来很难的题目,有不会的就去问身边会的人,让别人给自己讲清楚

       (4)大量的练习是必要且有效的。

下面再针对机试具体说说相关技巧吧:

在C\C++中常用的变量类型有很多种,想通过机试,掌握好其中的几种就可以,他们分别是int,double, string, char[] 

A

int 类型是最常用的整数类型,对于输入类型是整形的变量,使用int来进行定义和读入。还有一种更大的整形变量是longlong,在机试中一般不会涉及到考察,如果考虑到运算的过程中有可能超过int的大小,再考虑使用long long,int最大可以到达2^31级别,long long最大可以到达2^63。

如输入5,10

中间有一个逗号,在这种情况下,其实读入也是很简单的,可以这么写:

scanf(“%d%c%d”,&a,&b,&c);或者是:scanf(“%d”,&a);getchar();scanf(“%d”,&c);

有的机试题会说:两个整数之间有若干个空格符或tab字符。

在这种情况下,读入的方式还是使用scanf(“%d%d”,&a,&b)这样,scanf函数或者cin函数都可以很好的吃掉除了数字字符以外的字符。

B

double类型是最常用的浮点数类型,当运算涉及到小数运算的时候,需要使用double来定义。其中,特别需要注意的一点是,如果使用了如下语句:

double x=a/b;

在这里,a和b是int,那么x的值将是a和b整除后的结果,而不是想要的结果,想要得到期望的结果,须改成

double x=(a+0.0)/b;

在这里,将a加上一个浮点数,程序会在后台将它强制转换成一个double类型的数字,此时再除一个整数,就没有问题了。

C

string类型是遇到字符串类问题应该首选的变量,区别于字符数组char[],string类型是直接将字符数组封装了进去,定义string s相当于定义了一个大小特别长的字符数组。使用string的好处是,避免了使用char数组时定义数组长度过小导致越界,同时更加直观的将字符串看做了一个对象。

如果要定义一个string变量,首先得包含string的头文件以及使用C++中的标准命名空间,标准命名空间这个东西,只要记得写上就行,没有任何影响。

#include<iostream> //这一句是c++的头文件,c语言代码一样可以把它包含进来,只要将程序后缀名改成.cpp即可,其他都是一样的。

#include<string.h>

using namespace std;

在不同的环境下,可能会有不同的头文件包含了string的用法,可能的头文件有cstring,string。在机试的环境中,一般使用string.h即可。

定义一个string和定义其他变量方式相同:

string s;

读入和输出string也只需要使用

cin>>s;

cout<<s;

这是比c语言的字符数组要简单了很多的。

需要注意的是,string类型读入的时候与char数组的scanf读入一样,都是遇到空格符或者回车符就停止读入,当做一个完整字符串来处理,因此,使用string处理带空格的字符串是不明智的,其他情况下是都可以的。

string变量包含了很多强大的功能,如:

1. s[i];   //这么写,返回的就是字符串s第i+1位的字符,返回的类型是char型,其中,s[0]是它的第一位,与字符串相同。  

2. s.size();   //返回字符串的长度,返回的长度是l,则s从s[0]到s[l-1]表示的是其每一位的字符。  

3. if(s1<s2) //两个string是可以方便的使用大小于符号以及等于号来比较大小的,比较的方式是,从左向右按位进行比较,每一位按照字典序来比较。如”aaaa”<”abc”<”bcd”,但值得注意的一点是,比较的时候应用变量进行比较,即s1<s2这种,而不能用”aa”<”bb”这样,如果要比较他俩的大小,应这么写:  

4. s1="aa";s2="bb";  

5. if(s1<s2)  

string类型还有很多强大的功能,但是对于机试来说,会使用以上三种功能就足够了。

D

char[50],char[100]这种字符数组与string类型很像,只不过他是C语言里面的用法,对于机试,只建议在输入带有空格字符的字符串时使用char数组,使用的方式是:

gets(s);

在这里,gets函数区别于scanf函数的是,gets函数会直接将一整行读进来,而不会遇到空格就停下来。


       机试中,掌握好int,double,string,char[],还有数组,就足够用了,但考察的内容不仅仅是上述这些,想要通过机试,还是应该多多练习,多多学习,不局限于上面所说的内容。另外稍微说一下网测,主要是考察这个人是否积极向上,是否符合岗位需求,只要不是奇葩,应该都没问题的,遵从自己的内心去答题吧。

       最后祝各位童鞋轻松过机试,开心拿offer! 


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值