2011 华为机试题

17 篇文章 0 订阅

  1. 数组比较数组比较数组比较数组比较((20分) •

 问题描述:  比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素。请编程实现上述比较,并返回比较中发现的不相等元素的个数 .

比如: 数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0 数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3 要求实现函数:  int array_compare(int len1, int array1[], int len2, int array2[])  

【输入】 int len1:输入被比较数组1的元素个数; int array1[]:输入被比较数组1; int len2:输入被比较数组2的元素个数; int array2[]:输入被比较数组2; 

【输出】 无  

【返回】 不相等元素的个数,类型为int  

• 示例  1) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5},int len2 = 5 函数返回:0 

2) 输入:int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5,7},int len2 = 6 函数返回:3



2.    约瑟夫问题约瑟夫问题约瑟夫问题约瑟夫问题    • 问题描述: 

 输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。

请编程实现上述计数过程,同时输出数值出列的顺序  比如: 输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置) 第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数 第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数 第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数 最后一轮计数出列数字为4,计数过程完成。 输出数值出列顺序为:2,3,1,4。 

 • 要求实现函数:  void array_iterate(int len, int input_array[], int m, int output_array[]) 

【输入】 int len:输入数列的长度; int intput_array[]:输入的初始数列 int m:初始计数值 

【输出】 int output_array[]:输出的数值出列顺序 【返回】 无

• 示例  输入:int input_array[] = {3,1,2,4},int len = 4, m=7 

输出:output_array[] = {2,3,1,4}

#include <iostream>
using namespace std;
typedef struct Node
{
	int num;
	struct Node* next;
}node;

node *create(int len,int input_array[])
{
  node *head,*p,*s;
  head=(node*)malloc(sizeof(node));
  p=head;
  head->num=input_array[0];
  for(int i=1;i<len;i++)
  {
	s=(node*)malloc(sizeof(node));
	s->num=input_array[i];
	p->next=s;
	p=p->next;
  }
  p->next=head;
  return head;
}
void array_iterate(int len, int input_array[], int m, int output_array[])
{
   node *ppre,*pnext,*p;
   p=create(len,input_array);
   for(int i=0;i<len;i++)
   {
	 if(m==1)
	 {
		for(int j=1;j<len-i;j++)
			p=p->next;
		ppre=p;
		p=p->next;
		output_array[i]=p->num;
		pnext=p->next;
		ppre->next=pnext;
		p=pnext;
		m=output_array[i];
	 }
	 else
	 {
		for(int j=1;j<m;j++)
		{
			ppre=p;
			p=p->next;
			pnext=p->next;

		}
		ppre->next=pnext;
		output_array[i]=p->num;
		p=pnext;
		m=output_array[i];

	 
	 }
   }


}

int main()
{
 int input_array[] = {3,1,2,4};
 int len = 4,m=1;
 int output_array[4];
 array_iterate(len, input_array, m, output_array);
 for(int i=0;i<len;i++)
	 cout<<output_array[i]<<"	";
 cout<<endl;

 return 0;
}

3、    简单四则运算简单四则运算简单四则运算简单四则运算   

 • 问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值。 

注: 1、表达式只含 +, -, *, / 四则运算符,不含括号 

2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况 

3、要考虑加减乘除按通常四则运算规定的计算优先级 

4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生 

5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况

 • 要求实现函数:  int calculate(int len,char *expStr) 

【输入】 int len: 字符串长度; char *expStr: 表达式字符串; 

【输出】 无 【返回】 计算结果  

• 示例  1) 输入:char *expStr = “1+4*5-8/3” 函数返回:19

            2) 输入:char *expStr = “8/3*3” 函数返回:6 

//思路,将加减号之间算成一部分,分别求出其值,记做result1,result2,再看两者之间的符号,是‘+’还是‘-’,两者值存入result中,
//不断进行如此判定,求出下一个result1,result2,再将两者结果与result相加,存入result之中,即可。
//如3*2-4/2*3*5+3,则result1=3*2=>result=result+result1; result2=4/2*3*5=>result=result-result2;下一个result1=3,result=result+result1;结束
#include <iostream>
using namespace std;

int calculate(int len,char *expStr)
{
  int numf=0,numdata;
  for(int i=0;i<len;i++)
  {
	if(expStr[i]<'0' || expStr[i]>'9')
		numf++;
  }
  numdata=len-numf;
  char *arrayf=new char[numf];
  int *arraydata=new int[numdata];
  int pf=0,pd=0;
  for( i=0;i<len;i++)
  {
	 if(expStr[i]<'0' || expStr[i]>'9')
	 {
		arrayf[pf]=expStr[i];
		pf++;
	 }
	 else
	 {
		arraydata[pd]=expStr[i];
		pd++;
	 }
  }

  int  result1,result2,result=0,j=0,flag1=1;
  for(i=0;i<=numf;)
  {
	 //第一部分
	 result1=arraydata[j]-'0';
	 while(arrayf[i]=='*'||arrayf[i]=='/')
	 {
		if(arrayf[i]=='*')
		{
			j++;
			result1=result1*(arraydata[j]-'0');
		}
		if(arrayf[i]=='/')
		{
			j++;
			result1=result1/(arraydata[j]-'0');
		}
		i++;
	 }
	 cout<<"result1= "<<result1<<endl;
	 result=result+result1*flag1;

	 //第一部分与第二部分之间的符号,要吗为‘+’,要吗为‘-’
	 char tempf;
	 if(j<numdata-1)
	 {
		 tempf=arrayf[i];
		 cout<<"temp "<<tempf<<endl;/
	 }
	 i=i+1;
	 //第二部分,j没到末尾,说明后面还有计算
	 if(j<numdata-1)
	 {
		 //将单个或一堆乘除运算结果赋值给result2
		 j++;
		 result2=arraydata[j]-'0';
		 while(arrayf[i]=='*'||arrayf[i]=='/')
		 {
			if(arrayf[i]=='*')
			{
				j++;
				result2=result2*(arraydata[j]-'0');
			}
			if(arrayf[i]=='/')
			{
				j++;
				result2=result2/(arraydata[j]-'0');
			}
			//i用来指向下一个运算符号
			i++;
		 }
		 cout<<"result2= "<<result2<<endl;
		 //判断result1与result2之间是什么符号
		if(tempf=='+')
		{	
			result=result+result2;
		}
		if(tempf=='-')
		{	
			result=result-result2;
		}
		//判断下一个第一部分是什么符号
		if(j<numdata-1)
		{
			if(arrayf[i]=='+')
				flag1=1;
			else
				flag1=-1;
			cout<<"tempf "<<arrayf[i]<<endl;
			//既然没有结束,那么给下一个result1赋个值
			j++;
			//符号判断出来了,看下一个符号
			i++;
		}
		else  //j==numdata-1说明到了最后一个数
		{
			j++;
			i++;
		}
	 }
 }
  return result;
}

int main()
{
  char p[]="8/3*3-3*4*8/5+2*7*8/9-2-3-4+2*5";
  int len=strlen(p);
  int n=calculate(len,p);
  cout<<n<<endl;

 return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值