华为上机试题
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[]的长度,函数返回值为两个数组不同元素的个数。
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
3 实现高精度的加法,
); 其中,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); }
相关文章推荐
- 2014华为武汉上机试题三:CandyBrush游戏
- 2012华为校园招聘上机试题大全及答案(软件)
- 华为2013校招之哈工大威海 上机试题之一:报数问题:设有N 个人围坐一圈并按顺时针方向从1 到N 编号,从第S个人开始进行1 到M报数,报 数到第 M个人时,此人出圈,再从他的下一个人重新开始1 到 M的报数,如此进行下去直 到所有的人都出圈为止。现要打印出出圈次序。
- 华为上机试题:数字问题.
- 电话号码翻译(华为上机试题8_31_3)
- 2014华为上机试题
- 华为上机试题之子字符串替换
- 2013华为实习生上机考试试题(一)
- 华为校园招聘上机试题 Java实现(一)
- 华为上机试题1(删除字符串中出现次数最少的字符)
- 华为上机试题练习
- 华为校招上机试题之字符串特殊字符过滤
- 2012届华为上机试题之C语言-排序
- 2012华为校园招聘上机试题大全及答案(软件)
- 华为校招上机笔试试题(A卷)——java实现
- 2013华为实习生上机考试试题(一)
- 华为上机试题2(字符串分解)
- 华为上机试题及面试
- 2011年9月28日华为上机试题解析
- 华为校园招聘上机试题 Java实现(二)