您的位置:首页 > 其它

2011 华为机试题

2012-09-12 14:39 302 查看
  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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: