文档库 最新最全的文档下载
当前位置:文档库 › 华为机考题目及答案

华为机考题目及答案

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

输入:str = "abcde123abcd123"
sub_str = "1234"
输出:result_str = "abcde123abcd123"
返回:0
我的答案:
#include
#include

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

int main(int argc, char *argv[])
{
char *st = "12fuck345fuck678fuck9";
char *sub = "fuck3";
char res[50] ="";
int count = delete_sub_str(st, sub, res);
printf("子字符串的个数是:%d\n", count);
printf("删除子字符串后:\n%s\n", res);
return 0;
}

int delete_sub_str(const char *str, const char *sub_str, char *result_str)
{
int num = 0;
int i = 0;
int j = 0;
int k = 0;
int index = 0;
for(i = 0; str[i] != '\0'; i++)
{
index = i;
j = 0;
while(str[i] != '\0' && sub_str[j] != '\0' && str[i] == sub_str[j])
{
i++;
j++;
}
if(sub_str[j] != '\0')
{
i = index;
result_str[k] = str[i];
k++;
}
else
{
num++;
i--;
}
}
return num;
}

2.大数加减
问题描述:
在计算机中,由于处理器位宽限制,只能处理有限精度的十进制整数加减法,比如在32位宽处理器计算机中,参与运算的操作数和结果必须在-231~231-1之间。如果需要进行更大范围的十进制整数加法,需要使用特殊的方式实现,比如使用字符串保存操作数和结果,采取逐位运算的方式。如下:
9876543210 + 1234567890 = ?
让字符串 num1="9876543210",字符串 num2="1234567890",结果保存在字符串 result = "11111111100"。
-9876543210 + (-1234567890) = ?
让字符串 num1="-9876543210",字符串 num2="-1234567890",结果保存在字符串 result = "-11111111100"。
要求编程实现上述高精度的十进制加法。
要求实现函数:
void add (const char *num1, const char *num2, char *result)
【输入】num1:字符串形式操作数1,如果操作数为负,则num1[0]为符号位'-';num2:字符串形式操作数2,如果操作数为负,

则num2[0]为符号位'-'
【输出】result:保存加法计算结果字符串,如果结果为负,则result[0]为符号位。
注:
I、 当输入为正数时,'+'不会出现在输入字符串中;当输入为负数时,'-'会出现在输入字符串中,且一定在输入字符串最左边位置;
II、输入字符串所有位均代表有效数字,即不存在由'0'开始的输入字符串,比如"0012", "-0012"不会出现;
III、要求输出字符串所有位均为有效数字,结果为正或0时'+'不出现在输出字符串,结果为负时输出字符串最左边位置为'-'。
示例
输入:num1 = "580"
num2 = "-50"
输出:result = "530"

输入:num1 = "580"
num2 = "-600"
输出:result = "-20"

我的答案:
#include
#include

int cmp(const char* s1, const char* s2)
{
if(strlen(s1) > strlen(s2))
return 1;
else if(strlen(s1) < strlen(s2))
return -1;
else
return strcmp(s1, s2);
}

void rev(char *str)
{
char tem;
int i;
int len = strlen(str);
for(i = 0; i < len/2; i++)
{
tem = str[i];
str[i] = str[len - 1 - i];
str[len - 1 - i] = tem;
}
}

void add(const char *num1, const char *num2, char *result)
{
int i1 = strlen(num1) - 1;
int i2 = strlen(num2) - 1;
const char *p1 = num1;
const char *p2 = num2;
char p[200];
int r = 0;
int jw = 0;
if((p1[0] != '-') && (p2[0] != '-'))
{
while(i1 >= 0 && i2 >= 0)
{
result[r++] = ((p1[i1] - '0') + (p2[i2] - '0') + jw) % 10 + '0';
jw = ((p1[i1] - '0') + (p2[i2] - '0') + jw) / 10;
i1--;
i2--;
}
while(i1 >= 0)
{
result[r++] = ((p1[i1] - '0') + jw) % 10 + '0';
jw = ((p1[i1] - '0') + jw) / 10;
i1--;
}
while(i2 >= 0)
{
result[r++] = ((p2[i2] - '0') + jw) % 10 + '0';
jw = ((p2[i2] - '0') + jw) / 10;
i2--;
}
if(jw != 0)
{
result[r++] = jw + '0';
}
result[r] = '\0';
rev(result);
}
else if((p1[0] == '-') && (p2[0] == '-'))
{
while(i1 > 0 && i2 > 0)
{
result[r++] = ((p1[i1] - '0') + (p2[i2] - '0') + jw) % 10 + '0';
jw = ((p1[i1] - '0') + (p2[i2] - '0') + jw) / 10;
i1--;
i2--;
}
while(i1 > 0)
{
result[r++] = ((p1[i1] - '0') + jw) % 10 + '0';
jw = ((p1[i1] - '0') + jw) / 10;
i1--;
}
while(i2 > 0)
{
result[r++] = ((p2[i2] - '0') + jw) % 10 + '0';
jw = ((p2[i2] - '0') + jw) / 10;
i2--;
}
if(jw != 0)
{
result[r++] = '1';
}
result[r++] = '-';
result[r] = '\0';
rev(result);
}
else if((p1[0] != '-') && (p2[0] == '-'))
{
int index;
for(index = 0; p2[index] != '\0'; index++)
{
p[index] = p2[index + 1];
}
p[index] = '\0';
i2 = i2 - 1;
if(cmp(p1, p) == 1)
{
// p1 - p
while(i1 >= 0 && i2 >= 0)
{
if(((p1[i1] - '0') - (p[i2] - '0') - jw) >= 0)
{
result[r++] = ((p1[i1] - '0') - (p[i2] - '0') - jw) + '0';
jw = 0;
}
else if(((p1[i1] - '0') - (p[i2] - '0') - jw) < 0)
{
result[r++] = ((p1[i1] - '0') - (p[i2] - '0') - jw) + 10 + '0';
jw = 1;
}
i1--;
i2--;
}
while(i1 >= 0)
{
result[r++] = ((p1[i1] - '0') - jw) + '0';
jw = 0;
i1--;
}
result[r] = '\0'

;
rev(result);
}
else if(cmp(p1, p) == -1)
{
// p - p1
while(i1 >= 0 && i2 >= 0)
{
if(((p[i2] - '0') - (p1[i1] - '0') - jw) >= 0)
{
result[r++] = ((p[i2] - '0') - (p1[i1] - '0') - jw) + '0';
jw = 0;
}
else if(((p[i2] - '0') - (p1[i1] - '0') - jw) < 0)
{
result[r++] = ((p[i2] - '0') - (p1[i1] - '0') - jw) + 10 + '0';
jw = 1;
}
i1--;
i2--;
}
while(i2 >= 0)
{
result[r++] = ((p[i2] - '0') - jw) + '0';
jw = 0;
i2--;
}
result[r++] = '-';
result[r] = '\0';
rev(result);
}
else if(cmp(p1, p) == 0)
{
result[r++] = '0';
result[r] = '\0';
}
}
else if((p1[0] == '-') && (p2[0] != '-'))
{
int index;
for(index = 0; p1[index] != '\0'; index++)
{
p[index] = p1[index + 1];
}
p[index] = '\0';
i1 = i1 - 1;
if(cmp(p, p2) == 1)
{
// p - p2
while(i1 >= 0 && i2 >= 0)
{
if(((p[i1] - '0') - (p2[i2] - '0') - jw) >= 0)
{
result[r++] = ((p[i1] - '0') - (p2[i2] - '0') - jw) + '0';
jw = 0;
}
else if(((p[i1] - '0') - (p2[i2] - '0') - jw) < 0)
{
result[r++] = ((p[i1] - '0') - (p2[i2] - '0') - jw) + 10 + '0';
jw = 1;
}
i1--;
i2--;
}
while(i1 >= 0)
{
result[r++] = ((p[i1] - '0') - jw) + '0';
jw = 0;
i1--;
}
result[r++] = '-';
result[r] = '\0';
rev(result);
}
else if(cmp(p, p2) == -1)
{
// p2 - p
while(i1 >= 0 && i2 >= 0)
{
if(((p2[i2] - '0') - (p[i1] - '0') - jw) >= 0)
{
result[r++] = ((p2[i2] - '0') - (p[i1] - '0') - jw) + '0';
jw = 0;
}
else if(((p2[i2] - '0') - (p[i1] - '0') - jw) < 0)
{
result[r++] = ((p2[i2] - '0') - (p[i1] - '0') - jw) + 10 + '0';
jw = 1;
}
i1--;
i2--;
}
while(i2 >= 0)
{
result[r++] = ((p2[i2] - '0') - jw) + '0';
jw = 0;
i2--;
}
result[r] = '\0';
rev(result);
}
else if(cmp(p, p2) == 0)
{
result[r++] = '0';
result[r] = '\0';
}
}
}

int main(int argc, char *argv[])
{
char a5[] = "-9876543210";
char b5[] = "9876543210";
char c5[200];
add(a5, b5, c5);
printf("%s\n", c5);
return 0;
}


相关文档
相关文档 最新文档