华为校园招聘笔试题(机考题目)



01. 第一题的题目大概是输入整型数组求数组的最小数和最大数之和,例如输入1,2,3,4则输出为5,当输入只有一个数的时候,

 则最小数和最大数都是该数,例如只输入1,则输出为2;另外数组的长度不超过50


02. 求两个长长整型的数据的和并输出,例如输入1233333333333333 。。。 3111111111111111111111111.。。。,则输出


03. 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。

 比如字符串abacacde过滤结果为abcde

 要求实现函数:

 void stringFilter(const char*pInputStr, long lInputLen, char *pOutputStr);

 【输入】 pInputStr: 输入字符串

 lInputLen: 输入字符串长度

 【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

 

04. 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。

 压缩规则:

 1. 仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc".

 2. 压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"

 要求实现函数:

 void stringZip(const char*pInputStr, long lInputLen, char *pOutputStr);

 【输入】 pInputStr: 输入字符串

 lInputLen: 输入字符串长度

 【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

 

30. 计算重复字符个数

 描述: 输入一行字符串。如果字符是英文字母,则输出为输入的英文字符+连续出现的次数 ,

 例如 “ABBCCCC”-> “A1B2C4”;否则,丢弃该字符,不输出。

 运行时间限制: 无限制

 内存限制: 无限制

 输入: 输入的字符串,长度小于1024

 输出: ?输入的英文字符以及其重复的次数

 样例输入: ABBC67%%%CCCAA99

 样例输出: A1B2C4A2

  

27.统计数字出现的次数,最大次数的统计出来

 举例:

 输入:323324423343

 输出:3,6

 

07. 输入一串字符,只包含“0-10”找出其中最小的数字和最大的数字(可能不止一个),

输出最后剩余数字个数。如 输入 “3,3,4,5,6,7,7”

 

09. 删除子串,只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数。

 

14. 字串转换

 问题描述:

 将输入的字符串(字符串仅包含小写字母‘a’‘z’),按照如下规则,循环转换后输出:a->b,b->c,…,y->z,z->a

 ;若输入的字符串连续出现两个字母相同时,后一个字母需要连续转换2次。

 例如:aa 转换为bczz 转换为 ab;当连续相同字母超过两个时,第三个出现的字母按第一次出现算。

 要求实现函数:

 void convert(char *input,char*output)

 【输入】 char *input , 输入的字符串

 【输出】 char *output ,输出的字符串

 【返回】 无

 

35. 给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成bz换成aZ换成A

 * aBf转换成bCg,字符串内的其他字符不改变,给定函数,编写函数

 void  Stringchangconst  char*inpu,char*output

 其中input是输入字符串,output是输出字符串

 

29. 子串分离

题目描述:  

通过键盘输入任意一个字符串序列,字符串可能包含多个子串,子串以空格分隔。请编写一

个程序,自动分离出各个子串,并使用’,’将其分隔,并且在最后也补充一个’,’并将子

串存储。 

如果输入abcdef gh i        d”,结果将是abc,def,gh,i,d,

要求实现函数:  

void DivideString(const char *pInputStr, long lInputLen, char*pOutputStr);

【输入】  pInputStr  输入字符串

         lInputLen  输入字符串长度                  

【输出】  pOutputStr  输出字符串,空间已经开辟好,与输入字符串等长;

 

28. 字符串首字母转换成大写

 举例:

 输入:this is a book

 返回:This Is A Book

 

34. 输入若干不超过1000非负整数数字请先取出为奇数的数字按从大到小排序

 * 再取出偶数从小到大排序

 * 输入8 12 3 7 6 5 9

 * 9 8 6 3

 * 5 7 12

 * 输出9 5 8 7 6 12 3

  

38. 识别字符串中的整数并转换为数字形式(40分)

 问题描述:

 识别输入字符串中所有的整数,统计整数个数并将这些字符串形式的整数转换为数字形式整数。

 要求实现函数:

 void take_num(const char*strIn, int *n, unsigned int *outArray)

 【输入】 strIn   输入的字符串

 【输出】 n       统计识别出来的整数个数

 outArray:识别出来的整数值,其中outArray[0]是输入字符串中从左到右第一个整数,

 outArray[1]是第二个整数,以此类推。数组地址已经分配,可以直接使用

 【返回】 无

 注:

 I    不考虑字符串中出现的正负号(+, -),即所有转换结果为非负整数(包括0和正整数)

 II   不考虑转换后整数超出范围情况,即测试用例中可能出现的最大整数不会超过unsigned int可处理的范围

 III  需要考虑 '0' 开始的数字字符串情况,比如"00035" ,应转换为整数35

 "000" 应转换为整数0"00.0035" 应转换为整数035(忽略小数点:mmm.nnn当成两个数mmmnnn来识别)

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

 示例

 输入:strIn ="ab00cd+123fght456-25 3.005fgh"

 输出:n = 6

 outArray = {0, 123, 456, 25, 3, 5}

 

15. 在给定字符串中找出单词(单词由大写字母和小写字母字符构成,

 其他非字母字符视为单词的间隔,如空格、问号、数字等等;另外单个字母不算单词);

 找到单词后,按照长度进行降序排序,(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中;

 如果某个单词重复出现多次,则只输出一次;如果整个输入的字符串中没有找到单词,请输出空串。

 输出的单词之间使用一个空格隔开,最后一个单词后不加空格。

 要求实现函数:

 void my_word(charinput[],char output[])

 【输入】 char input[], 输入的字符串

 【输出】 char output[],输出的字符串

 【返回】 无

 


32:根据指定的分隔符分隔字符串,并输出指定的段

 描述

 根据指定的分隔符分隔字符串,并输出指定的段。如果指定的段超过分隔的段数,输出:NULL

 举例:

 AAA?BBB?CCC??2

 字符串为:AAA?BBB?CCC?

 分隔符为:?

 指定的段为:2

 字符串分割为:AAA BBB CCC共三段,第2段字符串为:BBB

 输入输出格式要求

 输入分隔字符串长度小于128个字符,指定的段是一个正整数。

 样例

 输入:AAA?BBB?CCC??2

 输出:BBB

 

21. (1)将第一行中含有第二行中“23”的数输出并排序

   (2).输入一行数字:123 423 5645 875 186523 ,在输入第二行:23

 将第一行中含有第二行中“23”的数输出并排序,结果即:123 423 186523

 

 

22. 输入m个字符串 和一个整数n, 把字符串M化成以N为单位的段,不足的位数用0补齐。

  n=8 m=9

 123456789划分为:  12345678

                    90000000

 123化为 :12300000

 

08.输入一组身高在170190之间(5个身高),比较身高差,选出身高差最小的两个身高;

若身高差相同,选平均身高高的那两个身高;从小到大输出;

如 输入170 181 173 186 190   输出 170 173

 

11. 描述:10个学生考完期末考试评卷完成后,A老师需要划出及格线,要求如下:

 (1) 及格线是10的倍数;

 (2) 保证至少有60%的学生及格;

 (3) 如果所有的学生都高于60分,则及格线为60

 输入:输入10个整数,取值0~100

 输出:输出及格线,10的倍数

 

12. 描述:一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号123…n-1n

 每盏电灯由一个拉线开关控制。开始,电灯全部关着。

 n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;

 接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;

 如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。

 注:电灯数和学生数一致。

 输入:电灯的数量

 输出:亮着的电灯数量

 样例输入:3

 样例输出:1

 

16. 数组中数字都两两相同,只有一个不同,找出该数字:

 异或运算的性质:任何一个数字异或它自己都等于0

因为其他数字都出现了两次,在异或中全部抵消掉了。

算法步骤:1,对1-n个数做异或运算,得到XOR = 1^2^3^4....^n

          2,   XOR与当前n-1数组的所有元素依次取异或:

因为XOR中与当前数字相同的数,都在异或运算中抵消掉了,最终剩下的,就是我们要找的那个丢失的数。

所谓抵消:举个例子: 112

1 0001

2:   0010                   1^1=0000             

 1^1^2 ===== 0000 ^ 0010 = 0010=2,也就是说两个1抵消了。

任何一个数字异或它自己都等于0,而0与任何数字求异或,都为原数字!

 

17. 题目二:数组中数字两两相同,有两个不同,找出这两个:

 

05. 通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。

 输入字符串的格式为:操作数1 运算符操作数2”操作数运算符之间以一个空格隔开。

 补充说明:

 1. 操作数为正整数,不需要考虑计算结果溢出的情况。

 2. 若输入算式格式错误,输出结果为“0”

 要求实现函数: 

 void arithmetic(const char*pInputStr, long lInputLen, char *pOutputStr);

 【输入】 pInputStr  输入字符串

 lInputLen  输入字符串长度         

 【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

 【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

 示例 

 输入:“4 + 7”  输出:“11”

 输入:“4 - 7”  输出:“-3”

 输入:“9 ++ 7”  输出:“0” 注:格式错误

 

18. 链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6k=2

则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现

思想:采用遍历链表,分成length/k组,对每组进行逆转,逆转的同时要将逆转后的尾和头连接起来

 

19. 链表相邻元素翻转,如a->b->c->d->e->f-g,翻转后变为:b->a->d->c->f->e->g

 

23将 电话号码 one two 。。。nine zero

 翻译成1 2 。。9 0

 中间会有double

 例如输入:OneTwoThree

 输出:123

 输入:OneTwoDoubleTwo

 输出:1222

 输入:1Two2 输出:ERROR

 输入:DoubleDoubleTwo 输出:ERROR

 有空格,非法字符,两个Double相连,Double位于最后一个单词 都错误

 

39. 将中文数字的拼音字符串转为最终的数字;每个字拼音的首字母大写,

 比如:JiuWanJiuQianJiuBaiJiuShiJiu表示九万九千九百九十九,即阿拉伯数字,。

 你当然记得每个数字的汉语拼音,但是还是提示你一下,

 LingYiErSanSiWuLiuQiBaJiuShiBaiQianWan

 为简单起见,我们要处理的数字在万以内,不含负数,十、百、千、万等单位前面一定有数字,如YiShi表示。

 输入: 中文数字的拼音字符串

 输出: 阿拉伯数字

 样例输入: SanBaiLingSan

 样例输出: 303

 

24.将整数倒序输出,剔除重复数据

 输入一个整数,如12336544,或1750,然后从最后一位开始倒过来输出,最后如果是0

 则不输出,输出的数字是不带重复数字的,所以上面的输出是456321571

 如果是负数,比如输入-175,输出-571

 

25.编程的时候,if条件里面的“(”“)”括号经常出现不匹配的情况导致编译不过,

 * 请编写程序检测输入一行if语句中的圆括号是否匹配正确。

 * 同时输出语句中出现的左括号和右括号数量,

 * if((a==1)&&(b==1))是正确的,

 * if((a==1))&&(b==1))是错误的。

 * 注意if语句的最外面至少有一对括号。提示:用堆栈来做。

 输入:if((a==1)&&(b==1))

 输出:RIGTH 3 3

 输入:if((a==1))&&(b==1))

 输出:WRONG 3 4

 

06.一组人(n个),围成一圈,从某人开始数到第三个的人出列,再接着从下一个人开始数,最终输出最终出列的人

(约瑟夫环是一个数学的应用问题:已知n个人(以编号123...n分别表示)

围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,

数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。)

 

26. 约瑟夫问题

输入一个由随机数组成的数列(数列中每个数均是大于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[], intm, 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}

解题思路:

每次出列一个数值,需要对minput_arrayoutput_array、输出位置outPos、起始位置startPos进行更新;

对于输出位置outPos的计算是关键!通过分析可知,outPos=(startPos+m-1)%num

 

31. 按字母序输出定长排列组合。输入“ABC”,定长为2,则输出

 AB AC BC

 

33:输入若干整数,输出其中能被这些整数中其他元素整除的那些元素

 描述

 输入一组大于0小于1000的整数,且均不相同,逗号隔开,输出其中能被这些整数中其他元素整除的那些元素。

 输入输出格式要求

 输入要求同上述描述,输出要求整数顺序按照输入时的顺序输出。

 样例

 输入:2,4,6,8,10,12,3,9

 输出:4,6,8,10,12,9

 

37. 给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,

 * 如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,

 * 然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。

 例如:input[] = {3, 6, 1, 9, 7}   output[] = {3, 7, 9, 6, 1};

 input[] = {3, 6, 1, 9, 7, 8}    output[] = {1, 6, 8, 9, 7, 3}

 

36.比较一个数组的元素 是否为回文数组

 

 

 

你可能感兴趣的:(华为校园招聘笔试题(机考题目))