2014华为校园招聘第三轮上机标题(南京-C/C++)

2014华为校园招聘第三轮上机题目(南京-C/C++)

2014华为校园招聘第三轮上机题目(南京-C/C++)


形式:

         使用OJ的形式,但是没有时间与内存限制。

工具:C/C++是VS2005,Java是Eclipse。

 

原创文章,转载请注明出处:http://blog.****.net/fastsort/article/details/11386827


1、回文数(60分)

给定一个数,判断在7步之内能不能变成回文数,如果能,则输出这个回文数,如果不能,则输出0.例如68,

68+86=154

154+451=605

605+506=1111,

1111是回文数,输出1111.

 

2、最接近的身高(100分)

输入5个人的身高,输出这些身高差最小的2个身高。如果有差相等的,则输出最大的两个。要求以升序输出。

例如输入175 177 178 180 181

则输出180 181

 

3、求二叉树某节点的深度(160分)

原来的第三题是一个关于围棋的,但是没有图,临时换成一个“二叉树”的。

输入一串字符表示二叉树,每个字符表示节点,其后紧跟这这个节点所在层次。根节点所在层次为1,例如a1b2c2d3e3f3表示如下一个二叉树:

              a

b           c

d            e            f

接着输入一串表示查询的节点,例如查询ab节点。要求输出该节点的深度,如果该点不在二叉树中,则输出0。

样例输入:a1b2c2d3e3f3

                     ab

输出:3 2



============================================================================================================

第一题:

#include	<iostream>
#include	<sstream>//stringstream
using	namespace	std;

/**
 **返回n的回文数
 */
int	Huiwen(string n)
{
	for(size_t i=0,j=n.length()-1;i<j;i++,j--)
	{
		swap(n[i],n[j]);
	}
	stringstream	ifs(n);
	int s=0;
	ifs>>s;
	return s;
}

int	fun(string n)
{
	int num;
	stringstream ssm(n);
	ssm>>num;
	int cnt=0;
	while(cnt<7)
	{
		if(num==Huiwen(n))
			break;
		else
		{
			num += Huiwen(n);
			stringstream ss;
			ss<<num;
			ss>>n;
		}
		cnt++;
	}
	if(cnt>=7)	return 0;
	return num;
}


int main()
{
	string n;
	cin>>n;
	cout<<fun(n)<<endl;
	return 0;
}

第二题:

#include	<iostream>
#include	<algorithm>

using	namespace	std;


struct	D
{
	int data;
	int index;
};

bool	operator<(const D& da, const D& db)
{
	return da.data<db.data;
}

int main()
{
	const	int M=5;
	D	a[M];
	for(int i=0;i<M;i++)
	{
		cin>>a[i].data;
		a[i].index = i;
	}
	sort(a,a+M);

	////
	D	df[M-1];
	for(int i=0; i<M-1; i++)
	{
		df[i].data  = a[i+1].data - a[i].data;
		df[i].index = i;
	}
	sort(df,df+M-1);

	int i=0;
	while(df[i].data==df[i+1].data)	i++;
	cout<<a[df[i].index].data<<" "<<a[df[i].index+1].data<<endl;
	return 0;
}

第三题:

#include	<iostream>
#include	<sstream>

using	namespace	std;


int main()
{
	string tree;
	cin>>tree;
	int h=0;//tree height
	for(int i=1; i<tree.length(); i+=2)
	{
		h = max(h, tree[i]-'0');
	}
	
	string nodes;
	cin>>nodes;

	for(int i=0; i<nodes.length(); i++)
	{
		char	n=nodes[i];
		bool	exist=false;
		for(int j=0; j<tree.length() && !exist; j+=2)
		{
			if(n==tree[j])
			{
				cout<<h-(tree[j+1]-'0')+1<<" ";
				exist = true;
			}
		}
		if(exist==false)
			cout<<"0 ";
	}
	return 0;
}

<<多谢wang603603提醒:最后一题解法不对,如果不是完全二叉树这种解法就错了。所以提交好几次都是80分……正确的做法还是要构建二叉树。

题目中说字符串是按照先根遍历给出的,但是答题的过程中又有人过来通知说不一定是先序遍历……fuck!>>


总结:总的来说,题目都很基础,但是我却没有答好,最后一题只得了80分。主要原因在于对vs2005相当不熟悉。没怎么用过,报错稀奇古怪的。用string都没法cin!!!这个过程折腾了好久。。

string str;
cin>>str;///提示没有>>运算

泥煤的,codeblocks从来都没问题的。

当时比较紧张,也没想到去包含什么头文件,只好全部用字符数组来弄了。

键盘旧的要命,上面字母都看不清了,各种不爽。。。

现在开始使用VS2005吧,冷门的工具毕竟不是主流,虽说codeblocks真的不错。。。


※使用sstream对字符串的各种转换,要包含sstream头文件,免得还要自己去转数组。

void    t()
{
    int i = 10102;
    float   f = 1.234;
    string  s="0.345";
    stringstream ss;

    ss<<i;
    string it;
    ss>>it;
    cout<<it<<endl;//10102
    ss.clear();

    ss<<f;
    string ft;
    ss>>ft;///"1.234"
    cout<<ft<<endl;//1.234
    ss.clear();

    ss<<s;
    float   sf;
    ss>>sf;
    cout<<sf<<endl;//0.345
    ss.clear();

}



1楼wang603603昨天 21:26
第三题不对, 题意你理解的有误吧! 没那么简单。n 不能直接减去, 因为不是 满二叉树。。!
Re: hello_world_2012昨天 21:32
回复wang603603n好像是哦。。。。
Re: wang603603昨天 22:00
回复hello_world_2012n这个符合题意,nhttp://blog.****.net/wang603603/article/details/11394915
Re: hello_world_2012昨天 22:53
回复wang603603n3Q