您的位置:首页 > 其它

华为上机试题

2012-09-16 17:05 204 查看
1. 从两个数组的最后一个元素比较两个数组中不同元素的个数,如有array1[5]={77,21,1,3,5}, array2[3]={1,3,5},从array1[4]与array2[2]比较开始,到array1[2]与array[0]比较结束。这样得出它们不同的元素个数为0,若array1[6]={77,21,1,3,5,7},那么他们不同的元素为3。 函数原型为 int compare_array( int len1, int array1[], int len2, int array2[]
); 其中,len1与len2分别为数组array1[]和array2[]的长度,函数返回值为两个数组不同元素的个数。

#include <iostream>
using namespace std;

int compare_array(int len1 ,int array1[] ,int len2 , int array2[])
{
int i , j,k;
k = 0;
i =  len1-1;
j = len2-1;
while((i>=0)&&(j>=0))
{
if((array1[i]!=array2[j]))
{
k++;
}
i--;
j--;
}
return k;
}

void main()
{
int array1[]={77,21,1,3,5,7};
int array2[]={1,3,5 };
int num = compare_array(6 , array1 , 3 ,array2);
cout<<num<<endl;
}

1. 删除字符串中所有给定的子串(40分)

问题描述:

在给定字符串中查找所有特定子串并删除,如果没有找到相应子串,则不作任何操作。

要求实现函数:

int delete_sub_str(const char *str, const char *sub_str, char *result_str)

【输入】 str:输入的被操作字符串

sub_str:需要查找并删除的特定子字符串

【输出】 result_str:在str字符串中删除所有sub_str子字符串后的结果

【返回】 删除的子字符串的个数

注:

I、 子串匹配只考虑最左匹配情况,即只需要从左到右进行字串匹配的情况。比如:

在字符串"abababab"中,采用最左匹配子串"aba",可以匹配2个"aba"字串。如果

匹配出从左到右位置2开始的"aba",则不是最左匹配,且只能匹配出1个"aba"字串。

II、 输入字符串不会超过100 Bytes,请不用考虑超长字符串的情况。

示例

输入:str = "abcde123abcd123"

sub_str = "123"

输出:result_str = "abcdeabcd"

返回:2

#include <iostream>
using namespace std;
int delete_sub_str(const char *str, const char *sub_str, char *result_str)
{
int i , j ,len1 ,len2,k ,count;
len1 = strlen(str);
len2 = strlen(sub_str);
count=0;
for(i = 0 ;i<len1 ;i++)
{
k = i;
for(j = 0 ;j<len2 ;j++)
{
if(str[i+j]!=sub_str[j])
{
break;
}
if(str[i+j]==sub_str[j]&&(j==len2-1))
{
i = i+len2-1;
count++;
}
}
if(k==i)
{
*result_str = str[i];
result_str++;
}
}
return count;

}
void main()
{
int  num;
char *str="babababab";
char *sub_str="aba";
char result_str[100]="";
num = delete_sub_str( str,  sub_str,  result_str);
cout<<num<<endl;
cout<<result_str<<endl;
}


3 实现高精度的加法,

#include <stdio.h>
#include <iostream>
#include <assert.h>
#include <string.h>
using namespace std;
void convert(char *str)
{
int len = strlen(str);
int i ;
for(i = 0 ;i<=(len-1)/2 ;i++)
{
int temp =  str[i];
str[i] = str[len-1-i];
str[len-1-i] = temp;
}
}

void add (const char *num1, const char *num2, char *result)
{

assert((num1 != NULL) && (num2 != NULL) && (result != NULL));
int len1 = strlen(num1);
int len2 = strlen(num2);
int ret[100] ={0};
char *pNum1=(char*)num1;
char *pNum2=(char*)num2;
char *pResult= result;
bool IsNum1PosInt=true;       ////////////判断符标记
bool IsNum2PosInt=true;
bool IsExchange = false;        ///////////是否交换两个数的信息标志位,将绝对值大的数放在第一个数上。
if(*pNum1 == '-')
{
IsNum1PosInt = false;
pNum1++;
len1--;
}
if(*pNum2 == '-')
{
IsNum2PosInt = false;
pNum2++;
len2--;
}
if(*pNum1 == '0' || *pNum2 == '0')
{
printf("error");
return ;
}
if(len1 < len2)
{
IsExchange = true;
}
else if(len1 == len2)
{
int j = 0;
for(j = 0 ;j<len1 ; j++)
{
if(pNum1[j]<pNum2[j])
{
IsExchange = true;
}
else
{
break;
}
}
}
if(IsExchange == true)
{
char *tmp = pNum1;
pNum1 = pNum2;
pNum2 = tmp;

int lentmp = len1;
len1 = len2;
len2 = lentmp;

bool Ispostmp = IsNum1PosInt;
IsNum1PosInt  = IsNum2PosInt;
IsNum2PosInt  = Ispostmp;
}
convert(pNum1);
convert(pNum2);
if(!(IsNum1PosInt^IsNum2PosInt))
{
int i;
for(i = 0 ; i<len1 ;i++)
{
if(i>=len2)
{
pNum2[i] = '0';
}
ret[i] += (pNum1[i]-'0') + (pNum2[i]-'0');
if(ret[i]>=10)
{
ret[i] = ret[i]%10;
ret[i+1]++;
}
}
if(!IsNum1PosInt)
{
pResult[0] ='-';
pResult++;
}
if(ret[i]==1)
{
len1++;
}
}
else
{
int i;
for(i = 0 ;i<len1 ;i++)
{
if(i>=len2)
{
pNum2[i] = '0';
}
ret[i] += (pNum1[i]-'0')-(pNum2[i]-'0');
if(ret[i]<0)
{
ret[i] = ret[i]+10;
ret[i+1]--;
}
}
if(ret[len1-1]==0)
{
len1--;
}
if(!IsNum1PosInt)
{
pResult[0]='-';
pResult++;
}
}
for(int j = 0 ;j<len1 ;j++)
{
pResult[j] = *((char*)(ret+len1-1-j))+'0';
}

}

void main()
{
char num1[100]="-100";
char num2[100]="50";
char reslut[100]="";
add(num1 ,num2 ,reslut);
//cout<<reslut<<endl;
puts(reslut);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: