2014年实习生招聘之华为实习生招聘笔试题(上机完成)—2014/04/02

作者: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##(注意字符之间并没有空格,输入完后回车)对于的二叉树形状如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值