2014华为校园招聘第三轮上机题目(南京-C/C++)
形式:
使用OJ的形式,但是没有时间与内存限制。
工具:C/C++是VS2005,Java是Eclipse。
原创文章,转载请注明出处:http://blog.youkuaiyun.com/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();
}