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