作者:Bryant Lei
出处:http://blog.csdn.net/bryantlei
华为(武汉)今年的实习生招聘的第一轮选拔是上机测试,其平台类似于常见的编程网站,即用户提交程序,由系统测试程序是否正确(是否通过测试样例)。之前我没有做过类似的编程,吃了很大亏,明明自己测试是对的,但是提交后却被系统告知程序错误,后来实在受不了,于是停止编写程序,去找找系统有没有提示,果然在“常见疑问”中看到了相关的说明,原来输入要求是标准输入,即C/C++必须用while(scanf("%d",&i)!=EOF),java用Scanner scanner = new Scanner(System.in),我在这浪费了很多时间。真实印证了那句话:“磨刀不误砍柴工”!
总共有3道题目,看上去貌似都不难,并且注明没有时间复杂度和空间复杂度的要求,三个题目如下。
1.把数字转化对应为小写字母并输出,例如输入 1 2 3 5 26 127 ef 1aa,就输出a b c e z ? ? ? ?。注意对非数字和空格的处理。
解答:
#include <stdio.h>
#define N 100
int isRightNumberFormat(char *str, int start, int end)//测试字符串start-end中的字符是否都是数字
{
while(start <= end)
{
if(str[start] > '0' && str[start] < '9')
start++;
else
return 0;
}
return 1;
}
int stringToNumber(char *str, int start, int end)//把字符串(start-end)转化为整数
{
int sum = 0,num;
while(start <= end)
{
num = (str[start] - '0');
sum = sum*10 + num;
start++;
}
return sum;
}
void numbersToLetters(char *str)//把数字转化为对应的小写字母,如1 2 3 26-> a b c z
{
int i=0,start,end,num;
while(str[i] != '\0')
{
if(str[i] == ' ')//如果字符是空格,则直接出处空格
{
printf(" ");
i++;
}
else
{
if(str[i] > '0' && str[i] < '9')
{
//如果字符是1-9范围中的数,则需要找到结束的那个字符对应的下标
//如“123 1”,则需要找到“3”对应的下标以判断这个字符串包含的字符是否都是数字
start = end = i;
while(str[end] !=' ' && str[end] !='\0')
end++;
end--;
//printf("%d",end);
if(isRightNumberFormat(str,start,end))
{
//start-end中的字符都是数字,则需要判断这个数字的大小
//如果在[1,26]内,则输出对应的小写字母
//否则输出?
num = stringToNumber(str,start,end);
if(num > 0 && num < 27)
{
printf("%c",(char)('a' + (num - 1)));
}
else
printf("?");
}
else //start-end中的字符并非都是数字
printf("?");
}
i=end+1;
}
}
}
int main()
{
int count=0;
char ch;
char str[N];
while((ch = getchar()) != EOF)
str[count++] = ch;
str[count]='\0';
numbersToLetters(str);
return 0;
}
2.升序输出数组中重复次数最多的数字,例如输入1 2 3 3 4 4 9 9 9,输出9,输入1 2 3 3 3 4 4 9 9 9,输出3 9。
解答:
/*
升序输出数组中重复次数最多的数字,
例如输入1 2 3 3 4 4 9 9 9,输出9,输入1 2 3 3 3 4 4 9 9 9,输出3 9。
*/
#include <iostream>
#include <map>
using namespace std;
typedef map<int,int> m_iip;//存放键值对,键是整数,值是整数出现的次数
int maxAppearenceInMap(m_iip pMap)
{
//返回map中key出现的最多的次数
//比如数组1 2 2 2 3 4 4 5,因为数组中2出现了最多次,3次,所以返回3
int maxValue = 0xffffffff;
m_iip::iterator iter;
for(iter = pMap.begin(); iter != pMap.end(); iter++)
{
if(iter->second > maxValue)
maxValue = iter->second;
}
return maxValue;
}
void printKeyWithDefinedAppearence(m_iip pMap, int appearence)
{
//输出map中有指定value的key
m_iip::iterator iter;
for(iter = pMap.begin(); iter != pMap.end(); iter++)//遍历map
{
if(iter->second == appearence)
cout<<iter->first<<" ";
}
cout<<endl;
}
int main()
{
int i;
m_iip tMap;
while((scanf("%d",&i) != EOF))
{
m_iip::iterator l_it = tMap.find(i);//find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。
if(l_it == tMap.end())
tMap[i] = 1;
else
{
tMap[l_it->first] += 1;
}
}
int maxAppearence = maxAppearenceInMap(tMap);
printKeyWithDefinedAppearence(tMap,maxAppearence);
return 0;
}
map中的元素是自动按key升序排序
map的基本操作函数:
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
3.求二叉树的深度。
#include <iostream>
using namespace std;
#define ElemType char
//节点声明,数据域、左孩子指针、右孩子指针
typedef struct BiTNode{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序建立二叉树
BiTree CreateBiTree(){
char ch;
BiTree T;
scanf("%c",&ch);
if(ch=='#')T=NULL;
else{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
T->lchild = CreateBiTree();
T->rchild = CreateBiTree();
}
return T;//返回根节点
}
//返回二叉树的深度
int depth(BiTNode* root)
{
int left,right;
if(root == NULL)
return 0;
left = depth(root->lchild);
right = depth(root->rchild);
return (left >= right) ? left+1:right+1;
}
//先序遍历二叉树
void PreOrderTraverse(BiTree T){
if(T){
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序遍历
void InOrderTraverse(BiTree T){
if(T){
PreOrderTraverse(T->lchild);
printf("%c",T->data);
PreOrderTraverse(T->rchild);
}
}
//后序遍历
void PostOrderTraverse(BiTree T){
if(T){
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
printf("%c",T->data);
}
}
void main(){
BiTree T;
//控制台输入124###3##,之间没有空格
T = CreateBiTree();//建立
PreOrderTraverse(T);//输出
cout<<endl;
cout<<depth(T);
//getch();
}
注解:建立二叉树时,要特别注意控制台的输入(我就在这混乱了很久)。124###3##(注意字符之间并没有空格,输入完后回车)对于的二叉树形状如下: