华为2014笔试算法题(字符串处理部分)
华为机考题目及答案

华为机考题目及答案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#includeint 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之间。
2014华为机试笔试题目

2014华为机试笔试题目2014华为机试笔试题目1.输入摸一个数,然后将其倒过来相加,如果和不是回文串,那么将和再采取同样的操作,在判断得到的是否为回文串,这样往返7次,如果其中有一次是回文就直接打出来,若都没有,那么输出0;也很简单!用库函数更简单,itoa这个!整数转成字符,然后判断回文!2.关于匹配的字符串的个数的最大值,即目标字符串与多个字符串比配,找出匹配最多的那个字符串。
其实代码很简单,我当时用2个数组,下标即为字符,值为出现次数,这样比较即可;可是我输入字符的代码写错了比如要输入Li si;到一个字符数组里面,我写成了char a[200];cin a;//这里错了,应该写为cin.getline(a,200);因为cin输入遇到空格就认为输入结束,所以只有li,没有si3.输入一个十进制的数,与一个n整数,求输出这个十进制数的n 进制的数!分析:哎,真倒霉,可以用atoi函数啊itoa函数#include cstdlib #include cstdio int main(){int num = 10; char str[100]; itoa(num, str, 2);printf( %s\n , str);return 0;}itoa()函数有3个参数:第一个参数是要转换的数字,第二个参数是目标字符串,第三个参数是转移数字时所用的基数。
在上例中,转换基数为10。
10:十进制;2:二进制于是想到了一个十进制转二进制的方法:#include cstdlib#include cstdioint main(){int num = 10;char str[100];int n = atoi(itoa(num, str, 2)); printf( %d\n ,n); return 0;}。
华为校招历年机试题目

华为历年笔试题目总结因最近要参加华为的招聘,便从网上搜集了一些华为笔试历年题目,现总结献给大家,因本人非软件出生,水平有限,仅供参考,若有误处,请海涵。
1、字符串问题∙问题描述:把一个字符串中的除大写字母、小写字母和数字字符之外的其他字符都去掉,输出新字符串。
∙要求实现函数:void my_string(char* input, char* output)【输入】char* input,输入的字符串【输出】char* output,输出的字符串【返回】无∙示例输入:inp ut = “A*(BC&De+_fg/*”输出:output = “ABCDefg”输入:input = “aB+_9”输出:output = “aB9”程序如下:void my_string(char* input, char* output){int i,j;i=j=0;while(*(input+i)!='\0'){if((*(input+i)>='A'&&*(input+i)<='Z')||(*(input+i)>='a'&&*(input+i)<='z')||(*(input+i)>='0'&&*(input+i)<='9')){*(output+j)=*(input+i);j++;}i++;}*(output+j+1)='\0';}题目描述:输入一个字符串,将其中大写字母转换为对应小写字母之后的第五个字母,若原始大写字母为V~Z, 则转换为对应小写字母的值减21。
其他字符不变,输出转换后的字符串。
例如,对于字母A,则转换为小写字母f;若形参是字母W,则转换为小写字母b要求实现函数:void TransferString(const char * pInputStr, long lInputLen, char * pOutputStr);【输入】pInputStr:输入字符串lInputLen:输入字符串长度【输出】pOutputStr:输出字符串,空间已经开辟好,与输入字符串等长;【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出示例输入:“Axs3mWss”输出:“fxs3mbss”void TransferString(const char * pInputStr, long lInputLen, char * pOutputStr){int i=0;for(i=0;i<lInputLen;i++){if(pInputStr[i]>='A'&&pInputStr[i]<'V')pOutputStr[i]=pInputStr[i]+'a'-'A'+5;else if(pInputStr[i]>='V'&&pInputStr[i]<='Z')pOutputStr[i]=pInputStr[i]+'a'-'A'-21;elsepOutputStr[i]=pInputStr[i];}}3. 单词统计题目描述:输入一段英文文本,用程序统计出现频率最高和最低的两个单词;英文文本中仅出现这四类字符:空格( )、英文逗号(,)、英文句号(.)、英文大小写字母(a-z、A-Z)单词之间的分隔符仅考虑这三种:空格( )、英文逗号(,)、英文句号(.);仅大小写不同的单词算同一个单词;如果两个单词出现次数相同,则在文本中首次出现的单词优先返回。
【笔试真题】-华为校招-算法工程师(附答案)

【笔试真题】-华为校招-算法工程师(附答案)
【笔试真题】华为2014校招-算法工程师(附答案)
题目:
1、通过键盘输入一串小写字母(a~z)组成的字符串。
请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。
要求实现函数:
void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr)
解析:
【输入】 pInputStr:输入字符串
IInputLen:输入字符串长度
【输出】 pOutputStr:输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出示例
输入:“deefd”输出:“def”
输入:“afafafaf”输出:“af"
输入:“pppppppp”输出:“p”。
华为校园招聘上机笔试题

华为校园招聘上机笔试题华为校园招聘上机笔试题上机时间两小时,3道题1 字串转换问题描述:将输入的字符串(字符串仅包含小写字母‘a’到‘z’),按照如下规则,循环转换后输出:a->b,b->c,…,y->z,z->a;若输入的字符串连续出现两个字母相同时,后一个字母需要连续转换2次。
例如:aa 转换为 bc,zz 转换为 ab;当连续相同字母超过两个时,第三个出现的字母按第一次出现算。
要求实现函数:void convert(char *input,char* output)【输入】 char *input , 输入的字符串【输出】 char *output ,输出的`字符串【返回】无示例输入:char*input="abcd"输出:char*output="bcde"输入:char*input="abbbcd"输出:char*output="bcdcde"void convert(char *input,char *output){char c='\0';int tag=0;int len=strlen(input);for(int i=0;i{if(input[i]!=c)//当前字符与前一个字符不相等,则该字符+1{output[i]=(input[i]-'a'+1)%26+'a';c=input[i];tag=1;}else{if(tag==1)//当前字符与前一个字符相等,且前面只有一个字符相同{output[i]=(input[i]-'a'+2)%26+'a';c='\0';tag=0;}else//当前字符与前一个字符相等,且前面已有2n个字符相同。
则按第一次出现算{output[i]=(input[i]-'a'+1)%26+'a';c=output[i];tag=1;}}}}void convert(char *input,char *output){char c='\0';int tag=0;int len=strlen(input);for(int i=0;i{if(input[i]!=c)//当前字符与前一个字符不相等,则该字符+1{output[i]=(input[i]-'a'+1)%26+'a';c=input[i];tag=1;}else{if(tag==1)//当前字符与前一个字符相等,且前面只有一个字符相同{output[i]=(input[i]-'a'+2)%26+'a';c='\0';tag=0;}else//当前字符与前一个字符相等,且前面已有2n个字符相同。
华为公司应聘程序员上机考试题

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<iostream>#include<cstdlib>#include<string.h>using namespace std;//删除指定的子字符串char* str_del(char* str,int pos,int length){for(int i=pos;i<(strlen(str)-length);i++){str[i] = str[i+length];}for(int i=(strlen(str)-length);i<strlen(str);i++){str[i] = '\0';}return str;}//从原串中获得子串char * get_sub_str(const char* str,int at,int length){char *res = new char[length];for(int i=at,j=0;i<at+length;i++,j++){res[j] = str[i];}return res;}int delete_sub_str(const char *str, const char *sub_str, char *&result_str) {int sub_len = strlen(sub_str);int str_len = strlen(str);int pos = 0;int del_num = 0;char* substr_instr;result_str = new char[sizeof(str)];strcpy(result_str,str);for(;pos<str_len-sub_len;pos++){substr_instr = get_sub_str(result_str,pos,sub_len);if(strcmp(substr_instr,sub_str) == 0){del_num++;result_str = str_del(result_str,pos,sub_len);}}return del_num;}int main(){char* str = "zhushijie";char* sub_str = "shi";char* res;cout<<"Delete num "<<delete_sub_str(str,sub_str,res)<<endl;cout<<res<<endl;return 0;}。
2014华为java笔试题目

2014华为java笔试题目一、单项选择题是从语言改进重新设计。
++答案:B2.下列语句哪一个正确程序经编译后会产生machinecode程序经编译后会产生bytecode程序经编译后会产生DLLD.以上都不正确答案:B3.下列说法正确的有中的constructor不可省略必须与class同名,但方法不能与class同名在一个对象被new时执行D.一个class只能定义一个constructor答案:c4.提供java存取数据库能力的包是答案:A5.下列运算符合法的是A.&&B.:=答案:A6.执行如下程序代码a=0;c=0;do{--c;a=a-1;}while;后,c的值是-1D.死循环答案:c7.下列哪一种叙述是正确的修饰符可修饰字段、方法和类B.抽象方法的body部分必须用一对大括号{}包住c.声明抽象方法,大括号可有可无D.声明抽象方法不可写出大括号答案:D8.下列语句正确的是A.形式参数可被视为localvariableB.形式参数可被字段修饰符修饰c.形式参数为方法被调用时,真正被传递的参数D.形式参数不可以是对象答案:A9.下列哪种说法是正确的A.实例方法可直接调用超类的实例方法B.实例方法可直接调用超类的类方法c.实例方法可直接调用其他类的实例方法D.实例方法可直接调用本类的类方法答案:D二、多项选择题程序的种类有A.类2.下列说法正确的有A.环境变量可在编译sourcecode时指定B.在编译程序时,所能指定的环境变量不包括classpath一次可同时编译数个java源文件能指定编译结果要置于哪个目录答案:BcD3.下列标识符不合法的有$答案:AcD4.下列说法错误的有A.数组是一种对象B.数组属于一种原生类=[]={31,23,33,43,35,63}D.数组的大小可以任意改变答案:BcD5.不能用来修饰interface的有答案:AcD6.下列正确的有不会改变实际参数的数值能改变实际参数的参考地址不能改变实际参数的参考地址能改变实际参数的内容答案:AcD7.下列说法错误的有A.在类方法中可用this来调用本类的类方法B.在类方法中调用本类的类方法时可直接调用c.在类方法中只能调用本类中的类方法D.在类方法中绝对不能调用实例方法答案:AcD8.下列说法错误的有面向对象语言容许单独的过程与函数存在面向对象语言容许单独的方法存在语言中的方法属于类中的成员语言中的方法必定隶属于某一类,调用方法与过程或函数相同答案:ABc9.下列说法错误的有A.能被成功运行的javaclass文件必须有main方法就是javaAPI可利用jar选项运行.jar文件D.能被Appletviewer成功运行的javaclass文件必须有main 方法答案:BcD三、判断题程序中的起始类名称必须与存放该类的文件名相同。
2014华为机考(附答案)

目录样题-初级题:从考试成绩中划出及格线 (2)样题-中级题:亮着电灯的盏数 (2)样题-高级题:地铁换乘 (3)8.29去掉最大值、最小值之后剩下的个数 (3)8.29从5个人中选取2个人作为礼仪 (5)8.29验证括号是否匹配 (6)8.31回文数 (8)8.31将第一行中含有第二行中“23”的数输出并排序 (9)8.31翻译电话号码 (11)9.1.AM 将整数倒序输出,剔除重复数据 (12)9.1.AM 大数相减 (14)9.1.AM 判断if语句括号是否合法 (15)9.1.PM (17)9.1.PM (18)9.1.PM (18)样题-初级题:从考试成绩中划出及格线10个学生考完期末考试评卷完成后,A老师需要划出及格线,要求如下:(1) 及格线是10的倍数;(2) 保证至少有60%的学生及格;(3) 如果所有的学生都高于60分,则及格线为60分样题-中级题:亮着电灯的盏数一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。
每盏电灯由一个拉线开关控制。
开始,电灯全部关着。
有n个学生从长廊穿过。
第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。
n个学生按此规定走完后,长廊里电灯有几盏亮着。
注:电灯数和学生数一致。
样题-高级题:地铁换乘已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。
经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。
编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次)。
地铁线A(环线)经过车站:A1 A2 A3 A4 A5 A6 A7 A8 A9 T1 A10 A11 A12 A13 T2 A14 A15 A16 A17 A18 地铁线B(直线)经过车站:B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B158.29去掉最大值、最小值之后剩下的个数1、输入一串数,以','分隔,输出所有数中去掉最大值、最小值之后剩下的个数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
华为2014笔试算法题(字符串处理部分)
1.通过键盘输入一串小写字母(a~z)组成的字符串。
请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
比如字符串“abacacde”过滤结果为“abcde”。
要求实现函数:void stringFilter(const char *pInputStr, long lInputLen, char
*pOutputStr);
【输入】pInputStr:输入字符串
lInputLen:输入字符串长度
【输出】pOutputStr:输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“deefd”输出:“def”
输入:“afafafaf”输出:“af”
输入:“pppppppp”输出:“p”
main函数已经隐藏,这里保留给用户的测试入口,在这里测试你的实现函数,可以调用printf打印输出
当前你可以使用其他方法测试,只要保证最终程序能正确执行即可,该函数实现可以任意修改,但是不要改变函数原型。
一定要保证编译运行不受影响
1. #include <iostream>
2. #include <cassert>
3.
4. u sing namespace std;
5.
6. b ool g_flag[26];
7. v oid stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr)
8. {
9. assert(pInputStr != NULL);
10. int i = 0;
11. if (pInputStr == NULL || lInputLen <= 1)
12. {
13. return;
14. }
15. const char *p = pInputStr;
16. while(*p != '\0')
17. {
18. if (g_flag[(*p - 'a')])
19. {
20. p++;
21. }else{
22. pOutputStr[i++] = *p;
23. g_flag[*p - 'a'] = 1;
24. p++;
25. }
26. }
27. pOutputStr[i] = '\0';
28. }
29. int main()
30. {
31. memset(g_flag,0,sizeof(g_flag));
32. char input[] = "abacacde";
33. char *output = new char[strlen(input) + 1];
34. stringFilter(input,strlen(input),output);
35. cout<<output<<endl;
36. delete output;
37. return 0;
38. }
2.
通过键盘输入一串小写字母(a~z)组成的字符串。
请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1、仅压缩连续重复出现的字符。
比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
2、压缩字段的格式为"字符重复的次数+字符"。
例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。
要求实现函数:
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】pInputStr:输入字符串
lInputLen:输入字符串长度
【输出】pOutputStr:输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“cccddecc”输出:“3c2de2c”
输入:“adef”输出:“adef”
输入:“pppppppp” 输出:“8p”
1. #include <iostream>
2. #include <cassert>
3. u sing namespace std;
4. void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr)
5. {
6. const char *p = pInputStr;
7. int num = 1;
8. int i = 0;
9. p++;
10. while(*p != NULL)
11. {
12. while(*p == *(p-1)&& *p != NULL)
13. {
14. num++;
15. p++;
16. }
17. if (num > 1)
18. {
19. int size = 0;
20. int temp = num;
21. while(num) //计算位数
22. {
23. size++;
24. num /= 10;
25. }
26. num = 1;
27.
28. for (int j = size; j > 0; j--)
29. {
30. pOutputStr[i+j-1] = '0'+ temp%10;
31. temp /= 10;
32. }
33. i +=size;
34. pOutputStr[i++] = *(p-1);
35. p++;
36. }else{
37. pOutputStr[i++] = *(p-1);
38. p++;
39. }
40. }
41. pOutputStr[i] = '\0';
42. }
43.
44. int main()
45. {
46. char input[] = "cccddecc";
47. char *output = new char[strlen(input) + 1];
48. stringZip(input,strlen(input),output);
49. cout<<output<<endl;
50. return 0;
51. }。