2012华为机试题目(C/C++)

1、选秀节目打分,分为专家评委和大众评委,score[]数组里面存储每个评委打的分数,judge_type[]里存储与 score[]数组对应的评委类别,judge_type[i] == 1,表示专家评委,judge_type[i] == 2,表示大众评委,n表示评委总数。打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家评委平均分  * 0.6 +大众评委 * 0.4,总分取整。如果没有大众评委,则总分 =专家评委平均分,总分取整。函数最终返回选手得分。

            函数接口   intcal_score(int score[], int judge_type[], int n) 

#include <iostream>
using namespace std;

int cal_score(int score[],int judge_type[],int n)
{
	int expert = 0;
	int publicJudge = 0;

	int number_of_expert = 0;
	int averageScore = 0;
	
	int index;
	
	for(index = 0; index < n;index++)
	{
		if(judge_type[index] = 1)
		{
			expert += score[index];
			number_of_expert ++;
		}
		else
		{
			publicJudge += score[index];
		}
	}

	if(number_of_expert == n)
		averageScore = expert/n;
	else
		averageScore = expert/number_of_expert*0.6 + publicJudge/(n-number_of_expert)*0.4;

	return averageScore;
}

int main()
{
	int n = 10;
	int score[10] = {80,85,90,80,75,95,80,90,95};
	int judge_type[10] = {1,2,1,1,2,2,1,1,2,1};
	int average_score = cal_score(score,judge_type,n);
	cout << average_score << endl;
	return 0;
}


      2、给定一个数组input[],如果数组长度n为奇数,则将数组中最大的元素放到 output[]数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output[]数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。

      例如:input[] = {3, 6,1, 9, 7}   output[] = {3, 7, 9, 6,1};            input[] = {3, 6, 1, 9, 7, 8}    output[] = {1, 6, 8, 9, 7,3}

             函数接口   voidsort(int input[[, int n, int output[])

#include <iostream>
using namespace std;

#define N 1000

void bubbleSort(int a[],int len)
{
	int i,j,temp;
	for(i = 0;i < len-1;i++)
		for(j = i+1;j < len;j++)
		{
			if(a[i] > a[j])
			{
				temp = a[i];
				a[i] = a[j];
				a[j] = temp;
			}
		}
}

void sort(int input[], int len, int output[])
{

	int mid = len/2;
	int left =  mid - 1;
	int right = mid + 1;
	

	bubbleSort(input,len);

	int index = len - 1;
	output[mid] = input[index--];
	while(index >= 0)
	{
		output[left--] = input[index--];
		output[right++] = input[index--];
	}

	for(left = 0;left < len;left++)
		cout << output[left] << " ";
}

int main()
{
	int arr[] = {3,6,1,9,7,8};
	int destArr[N];
	sort(arr,6,destArr);

	cout << endl;

	int arr1[] = {31,6,15,9,72,8,99,5,6};
	int destArr1[N];
	sort(arr1,9,destArr1);
	
	return 0;
}

      3、操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 50,用户任务的优先级 >= 50 <= 255。优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为ntask中的元素值表示任务的优先级,数值越小,优先级越高。函数scheduler实现如下功能,将task[]中的任务按照系统任务、用户任务依次存放到 system_task[]数组和 user_task[]数组中(数组中元素的值是任务在task[]数组中的下标),并且优先级高的任务排在前面,优先级相同的任务按照入队顺序排列(即先入队的任务排在前面),数组元素为-1表示结束。

      例如:task[] = {0, 30,155, 1, 80, 300, 170, 40, 99}    system_task[] = {0, 3, 1, 7,-1}    user_task[] = {4, 8, 2, 6, -1}

            函数接口   void scheduler(int task[], int n, int system_task[], int user_task[])

#include <iostream>
using namespace std;

typedef struct stask{
	int priority;
	int index;
}task_node;

void scheduler(int task[], int n, int system_task[], int user_task[])
{
	int i;
	task_node *task_list;
	task_list = new task_node[n*sizeof(task_node)];
	//将task序列中的任务优先级和下标存入任务结构中.
	for(i = 0;i < n; i++)
	{
		task_list[i].priority = task[i];
		task_list[i].index = i;
	}
	
	//根据优先级对任务排序.
	task_node temp;
	for(i = 0;i < n - 1;i++)
	{
		for(int j = i+1;j < n;j++)
			if(task_list[i].priority > task_list[j].priority)
			{
				temp = task_list[i];
				task_list[i] = task_list[j];
				task_list[j] = temp;
			}
	}
	int k1= 0,k2 = 0;
	//将任务归类存入不同数组.
	for(i = 0;i < n - 1;i++)
	{
		if(task_list[i].priority<50)
			system_task[k1++] = task_list[i].index;
		else
			if(task_list[i].priority >= 50 && task_list[i].priority <= 255)
				user_task[k2++] = task_list[i].index;
	}
	system_task[k1] = -1;
	user_task[k2] = -1;
	
	//输出归类结果.
	for(i = 0;i <= k1;i++)
		cout << system_task[i] << " ";
	cout << endl;
	for(i = 0;i <= k2;i++)
		cout << user_task[i] << " ";
	
	delete [] task_list;
}

int main()
{
	int task[] = {0, 30,155, 1, 80, 300, 170, 40, 99};
	int system_task[10];
	int user_task[10];
	scheduler(task, 9, system_task, user_task);
		
		return 0;
}

4.身份证号码合法性判断 问题描述 

我国公民的身份证号码特点如下: 

1.长度为18位 

2.1-17位只能为数字 

3.第十八位可以是数字或者小写英文字母 

4.身份证号码的第7-14位表示持有人生日的年月日信息 

 
请实现身份证号码合法性判断的函数,除满足以上要求外,需要对持有人生日的年月日信息进行校验,年份大于等于1900,小于等于2100年。需要考虑闰年、大小月的情况。所谓闰年,能被4整除且不能被100整除或能被400整除的年份。闰年2月份为29天,非闰年的2月份为28天。其他情况的合法性校验,不用考虑  
函数返回值: 
1.如果身份证号合法,返回0 
2.如果身份证号长度不合法,返回1 
3.如果身份证号第1-17位含有非数字的字符,返回2 
4.如果第十八位既不是数字也不是英文小写字母x,返回3 5.如果身份证号的年信息非法,返回4 
6.如果身份证号的月信息非法,返回5 
7.如果身份证号的日信息非法,返回6(请注意闰年的情况) 
 
注:除成功的情况外,以上其他情况合法性判断的优先级依次降低,也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断  
要求实现函数 
int verifyIDCard(char *input)  
示例: 
1.输入:"511002 111222"返回1 

2.输入:"511002 abc123456789" 返回2

 3.输入:"511002 19880808123a"返回3

 4.输入:"511002 188808081234" 返回4

 5.输入:"511002 198813081234" 返回5 

6.输入:"511002 198808321234"返回6

 7.输入:"511002 198902291234"返回7 

8.输入:"511002 198808081234"返回0

5. 链表逆序

#include <iostream>
#include <assert.h>
using namespace std;

typedef struct NODE{
	int value;
	NODE *pNext;
}Node,*pNode;

//创建链表.   
Node* creat()    
{
	int nuberOfNode = 5;
	int data;
    pNode head = new Node;  
	
    if(NULL == head)
		cout << "分配内存失败\r\n";
	
    head->pNext = NULL;    
    
    pNode p = head;
	pNode s = NULL;
	cout << "请输入数据:\r\n";
    while(nuberOfNode--)    
    {    
        cin >> data;    		
		s = new Node;		
		assert(NULL != s);		
		s->value = data;    
		p->pNext = s;    
		p = s; 
    }    
    p->pNext = NULL;    
    return(head);    
}    

//实现链表逆序.
pNode reverseList(pNode Header)
{
	//空链表或只有一个节点.
	if(Header == NULL || Header->pNext == NULL)
		return 0;
	
	//pre,cur分别指向首节点,第二个节点.
	pNode pre = Header->pNext;
	pNode cur = pre->pNext;
	pre->pNext = NULL;
	pNode next = NULL;
	
	while(NULL != cur)
	{
		next = cur->pNext;
		cur->pNext = pre;
		pre = cur;
		cur = next;
	}
	Header->pNext = pre;//有头结点的链表.
	
	return Header;
}

//打印链表.
void printList(pNode head)
{
	pNode start = head->pNext;
	while(start)
	{
		cout << start->value << " ";
		start = start->pNext;
	}
}

int main()
{
	pNode pl = creat();
	printList(pl);
	cout << endl;
	printList(reverseList(pl));
	
	return 0;
}

6. 查找子字符串出现次数,并从原字符串中删除。

/*
编写函数,string deletestring(string str,string sub_str)从str中查找
匹配的字符串sub_str,采用最左匹配,且输出形式为str+"_"+匹配的次数。
*/
#include <iostream>
using namespace std;

//删除指定位置字符串.
void delSpecifiedSubString(char *str,int start,int end)
{
	char *p1 = &str[start];
	char *p2 = &str[end + 1];
	while((*p1++ = *p2++) != '\0');
}

int delSubString(char *str,char *subStr)
{
	int count = 0;
	int index = 0;

	char *pstr = str;
	char *psubStr = subStr;

	if(str == NULL ||subStr == NULL)
		return 0;

	while(*pstr != '\0')
	{
		if(*pstr == *psubStr)
		{
			pstr++;
			psubStr++;
			index++;
		}
		else
		{
			psubStr = subStr;
			pstr = pstr - index + 1;
			index = 0;
		}
		if(*psubStr == '\0')
		{
			count++;
			psubStr = subStr;
			delSpecifiedSubString(str,
				pstr - index - str,
				pstr - 1 - str);
		}
	}
	cout << str << " " << count << endl;
	return count;
}

int main()
{
	char str[50];
	char subStr[30];
	cout << "输入str和subStr:" << endl;
	gets(str);
	gets(subStr);
	delSubString(str,subStr);

	return 0;
}


//错误有做法!!!
#include <iostream>
#include <string>
using namespace std;

char *fun(char *str,char *subStr)
{
	string s(str);
	while(s.find(subStr) != string::npos)
	{
		cout << s.find(subStr) << endl;
		//从s中删除找到的子字符串subStr.
		s.erase(s.find(subStr),strlen(subStr));
	}
	char *m = new char[50];
	strcpy(m,s.c_str());
	//注意这边的string转成char*返回值是const char*,不能直接将其return,
	//而且不能直接赋给char*,需要用strcpy来做。

	return m;
}

int main()
{
	char str[50];
	char subStr[30];
	gets(str);
	gets(subStr);
	cout << str << endl;
	cout << subStr << endl;
	cout << fun(str,subStr) << endl;

	return 0;
}


//功能:删除str中的subStr.
//正确的方法!!!
#include <iostream>
#include <string>
using namespace std;

char *fun(char *str,char *subStr)
{
	string s(str);
	int index = 0;
	while(s.find(subStr,index) != string::npos)
	{
		 index = s.find(subStr,index);
		//从s中删除找到的子字符串subStr.
		s.erase(s.find(subStr),strlen(subStr));
		index++;
	}
	char *m = new char[50];
	strcpy(m,s.c_str());
	//注意这边的string转成char*返回值是const char*,不能直接将其return,
	//而且不能直接赋给char*,需要用strcpy来做。

	return m;
}

int main()
{
	char str[50];
	char subStr[30];
	gets(str);
	gets(subStr);
	cout << "str:" << str << endl;
	cout <<  "subStr:" << subStr << endl;
	cout <<  "result:" << fun(str,subStr) << endl;

	return 0;
}


/*将一个字符串的元音字母复制到另一个字符串,并排序(30分)
问题描述:
有一字符串,里面可能包含英文字母(大写、小写)、数字、特殊字符,现在需要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序)。
 
说明:
1、  元音字母是a,e,i,o,u,A,E,I,O,U。
2、  筛选出来的元音字母,不需要剔重;
 
最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序。
 
要求实现函数:
void sortVowel (char* input, char* output);
【输入】  char* input,表示输入的字符串
【输出】  char* output,排好序之后的元音字符串。
【返回】  无
 
示例
输入:char *input = “Abort!May Be Some Errors In Out System. “
输出:char *output =“aeeeooAEIO */
#include <iostream>
using namespace std;

void sortVowel(char *input,char *output)
{
	char arr[10] = {'a','e','i','o','u','A','E','I','O','U'};
	int number[10] = {0};
	int i = 0;
	int sum = 0;
	
	while('\0'!= *input)
	{
		for(i = 0;i < 10;i++)
		{
			if(arr[i] == *input)
			{
				number[i]++;
				break;
			}
		}
		input++;
	}
	
	//计算总的出现元音字母的次数.
	for(i = 0;i < 10;i++)
		sum += number[i];

	output = new char[sum+1];
	char *start = output;
	
	for(i = 0;i < 10;i++)
	{
		while(number[i]--)
			*start++ = arr[i];
	}
	*start = '\0';
	while(*output!= '\0')
		cout << *output++;
	
	cout << endl;		
}

int main()
{
	char input[] = "Abort!May Be Some Errors In Out System.";
	char *output = NULL;
	sortVowel(input,output);
	
	return 0;
}



  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值