2015 华为 校招回忆录---篇(上)

本文由CSDN-蚍蜉撼青松【主页:http://blog.csdn.net/howeverpf】原创,转载请注明出处!

写在前面:

        当前华为公司的一次机试,共三道不同难度的编程题(其中,初级题60分、中级题100分、高级题160分),机试成绩>=60即可参加下一轮面试。一定程度上说,只要完全做对初级题,就可以通过机试的考验。当然,这样的通过肯定不太利于后面的面试。

        写作本文的目的有两个,一是对本次参加的华为公司机试做个整理和小结,属于自我提升;二是让各位求职的应届生同道能够直观体验当前一般的机试题大概是何种类型,难度又有几分,属于经验分享。由于只是作为体验而非试题汇总,所以本文只列举了我以及我的小伙伴们遇到的几次机试中的初级题,并不做更多的收集。

        每道题包括题目详情、编程思路、代码实现三部分。  

1、输出重复的英文字符

描述:

在字符串中,将重复(重复次数可以两次以上)的英文字符(字符包括a~z、A~Z)挑选出来输出,不重复的不输出。

运行时间限制:

无限制

内存限制

无限制

输入:

输入一个字符串

输出:

输出重复的字符,按到字符第一次出现的顺序输出

样例输入:

AACCDDAA

样例输出:

ACD

编程思路

        先遍历一次整个输入字符串,分别记录所有出现过的字符(剔除重复的,按字符第一次出现位置的先后排列。用数组cExistChar)以及他出现的次数(为了操作方便,可以用分配排序的思想。用数组nApperTimes);

        再遍历一次数组cExistChar,若其出现次数大于1,则输出。

代码实现

[cpp] view plaincopyprint?

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define MAX_IN_SIZE 1000   // 输入字符串的最大长度
  5. int print_repeat_chars(char *pszString)  
  6. {  
  7. char cExistChar[52];   // 所有出现过的字符(剔除重复的|最多52个)
  8. int nExistCharCount = 0;  // 当前一共出现了多少不重复的字符
  9. int nApperTimes[52];   // 所有英文字符出现过的次数(基于分配排序思想,以英文字符的值的某种运算结果作为下标)
  10. int i,nStrLen = 0;  
  11. char temp;  
  12.     memset(nApperTimes, 0, sizeof(nApperTimes));  
  13. // 遍历整个输入字符串
  14.     nStrLen = strlen(pszString);  
  15. for(i=0; i<nStrLen; i++)  
  16.     {  
  17.         temp = *(pszString+i);  
  18. if( temp>='A' && temp<='Z')  
  19.         {  
  20. // 大写英文字符是否是第一次出现
  21. if(nApperTimes[temp-'A']==0)  
  22.             {  
  23. // 记录前面没出现过的新大写英文字符
  24.                 cExistChar[nExistCharCount++] = temp;  
  25.             }  
  26.             nApperTimes[temp-'A']++;  
  27.         }  
  28. else if( temp>='a' && temp<='z')  
  29.         {  
  30. // 小写英文字符是否是第一次出现
  31. if(nApperTimes[temp-'a'+26]==0)  
  32.             {  
  33. // 记录前面没出现过的新大写英文字符
  34.                 cExistChar[nExistCharCount++] = temp;  
  35.             }  
  36.             nApperTimes[temp-'a'+26]++;  
  37.         }  
  38. //只处理52个大小写英文字符,其余字符不处理
  39.     }  
  40. // 遍历cExistChar
  41. for(i=0; i<nExistCharCount; i++)  
  42.     {  
  43.         temp = cExistChar[i];  
  44. if( temp>='A' && temp<='Z')  
  45.         {  
  46. // 输出出现次数大于1的大写字符
  47. if(nApperTimes[temp-'A']>1)  
  48.                 printf("%c", temp);  
  49.         }  
  50. else if( temp>='a' && temp<='z')  
  51.         {  
  52. // 输出出现次数大于1的小写字符
  53. if(nApperTimes[temp-'a'+26]>1)  
  54.                 printf("%c", temp);  
  55.         }  
  56.     }  
  57. return 0;  
  58. }  
  59. int main(void)  
  60. {  
  61. char szInString[MAX_IN_SIZE];  //输入字符串
  62. // 获取输入的字符串
  63.     scanf("%s", szInString);  
  64. // 打印输入字符串中重复的英文字符
  65.     print_repeat_chars(szInString);  
  66. return 0;  
  67. }  

2、笨笨熊搬家打包篇

描述:

森林里的笨笨熊今天可开心啦——他买了新房子,乔迁新喜要搬家了。因此,笨笨熊请了许多好朋友来帮忙搬家,并准备了很多小纸盒用来装需要搬的物品,不过,这些纸盒的容积都是相同的,并且最多只能装两个物品。但是,为了不打扰太多的朋友,笨笨熊想了个“聪明”办法:让每个纸盒使用效率最高(注:只要纸盒容积大于物品的体积之和就认为可以装下;物品体积不会大于纸盒容积),这样需要的纸盒最少。为了帮助笨笨熊提前通知朋友,请你根据笨笨熊的办法,帮忙算出:需要纸盒的最少数目是多少?

运行时间限制:

无限制

内存限制

无限制

输入:

整数V——纸盒的容积; 整数N——物品的总数目N; 共N个整数(对应N个物品的体积,每个整数用空格隔开)。

输出:

整数M——需要纸盒的最少数目;

样例输入:

10 2  2 3

样例输出:

1

编程思路

        先把所有物品按体积从大到小排个序。

        然后用两个指针分别从头、尾向中间遍历,直到头指针与尾指针重合,或超过尾指针。在遍历的过程中,对于头指针,恒速后推;对于尾指针,取当前头、尾指针指向的物品(即当前剩余物品中体积最大和最小的物品),体积求和,若小于盒子的体积,则尾指针前移一位。

        若头、尾指针重合,则最少所需盒子数为头指针的位移量+1;若头指针超过了尾指针,则最少所需盒子数为头指针的位移量。

代码实现

[cpp] view plaincopyprint?

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define ITEMS_COUNT_MAX 100
  4. // 冒泡降序排序
  5. //参数 pSortList, 待排序序列
  6. int my_sort_bubble(int *pSortList, int nListSize)  
  7. {  
  8. int i,j;  
  9. bool bIfContinue = true;  //外循环继续标志(如果你要写纯C程序,当然就需要把这里替换成整型)
  10. for(i=0; i<nListSize-1 && bIfContinue; i++)  //bIfContinue为false时,直接退出外循环
  11.     {  
  12.         bIfContinue = false;  //内循环开始前假定i后面的子序列已经完全有序,外循环继续标志置为false
  13. // 从最后一个元素开始,直到第 i+1 个元素
  14. // 所有元素依次和它的前一个元素作关键字比较,更大则交换
  15. for(j=nListSize-1; j>i; j--)  
  16.         {  
  17. if(pSortList[j] > pSortList[j-1]) //冒泡排序比小,咱比大
  18.             {  
  19.                 bIfContinue=true;  //只要有一次元素交换,说明未完全有序,则外循环需要继续
  20.                 pSortList[j]   = pSortList[j] + pSortList[j-1];  
  21.                 pSortList[j-1] = pSortList[j] - pSortList[j-1];  
  22.                 pSortList[j]   = pSortList[j] - pSortList[j-1];  
  23.             }  
  24.         }  
  25.     }  
  26. return 0;  
  27. }  
  28. // 计算最少所需盒子数
  29. //参数 nVolume_of_box, //盒子的容积V
  30. //参数 nNum_of_items,  //物品的数量N
  31. //参数 pnVolume_of_items, //N个物品的体积
  32. //返回 最少所需盒子数
  33. int calc_least_box_count(int nVolume_of_box, int nNum_of_items, int *pnVolume_of_items)  
  34. {  
  35. int i,j;  
  36. if(nNum_of_items <= 1)  
  37. return nNum_of_items;  
  38. // 先对所有物品的体积从大到小排序
  39.     my_sort_bubble(pnVolume_of_items, nNum_of_items);  
  40. // 输入合法性判定,不可能有体积大于盒子容积的物品
  41. if(pnVolume_of_items[0] > nVolume_of_box)  
  42. return -1;  
  43. // 物品体积等于盒子容积时,必然单独占一个盒子
  44. for(i=0; pnVolume_of_items[i] == nVolume_of_box; i++)  
  45.         ;  
  46.     j = nNum_of_items-1;  
  47. for(; i<j; i++)  
  48.     {  
  49. // 小物品和大物品的体积和若小于盒子容积,则小物品不单独使用盒子
  50. if(pnVolume_of_items[i]+pnVolume_of_items[j] <= nVolume_of_box)  
  51.             j--;  
  52.     }  
  53. if(i == j)  
  54. return i+1;  
  55. return i;  // i > j
  56. }  
  57. int main(void)  
  58. {  
  59. int nVolume_of_box;  //盒子的容积V
  60. int nNum_of_items;   //物品的数量N
  61. int *pnVolume_of_items; //N个物品的体积
  62. int i;  
  63.     scanf("%d", &nVolume_of_box);  //获取盒子容积
  64.     scanf("%d", &nNum_of_items);   //获取物品数量
  65.     pnVolume_of_items = (int*)malloc(nNum_of_items * sizeof(int)); //根据物品数量创建存储空间
  66. for(i=0; i<nNum_of_items; i++)  
  67.         scanf("%d", &pnVolume_of_items[i]); //挨个录入物品的体积(特别注意勿忘取地址符)
  68.     printf("%d", calc_least_box_count(nVolume_of_box, nNum_of_items, pnVolume_of_items));  
  69. return 0;  
  70. }  

3、出租车计费(测试模拟题)

描述:

起步价6元,里程小于等于2公里时间少于10分钟,收取起步价,大于2公里或者时间超过10分钟后,同时按照两种计费方式计算: (1)按里程计算:每0.5公里收取0.7元(不足0.5公里不计费),大于7公里后,在此基础上,每公里再多收取0.7元作为返程费(不足1公里不计费); (2)按照时间计算:每3分钟收取1.4元(不足3分钟不计费) 最终,以二者中较大者作为最终收取费用。

运行时间限制:

无限制

内存限制

无限制

输入:

输入公里数(浮点数)和时间(整数,单位分钟),以空格隔开

输出:

输出价格(保留小数点后1位)

样例输入:

13.4 50

样例输出:

25.6

编程思路

        分别以里程、时间为依据计算收费,取二者中的较大值。

代码实现

[cpp] view plaincopyprint?

  1. #include <stdio.h>
  2. int main(void)  
  3. {  
  4. float fDistance; // 里程
  5. int nTime;       // 时间
  6. float fPrice1=6.0,fPrice2=6.0; // 两种不同计费方式的费用值
  7. int n;  
  8. // 获取输入的里程和时间
  9.     scanf("%f %d", &fDistance, &nTime);  
  10. if(fDistance<=2.0 && nTime<=10)  
  11.         printf("6.0");  // 满足起步价条件,fPrice1=fPrice2=6.0
  12. else
  13.     {  
  14. // 若里程数大于2公里,需要另外计算 fPrice1
  15. if(fDistance>2.0)  
  16.         {  
  17.             n = (int)((fDistance-2.0)/0.5); // 显式取整,因为不足0.5公里不计费
  18.             fPrice1 += n*0.7;  
  19. // 若里程数大于7公里,需要附加返程费
  20. if(fDistance>7.0)  
  21.             {  
  22.                 n = (int)(fDistance-7.0);   // 显式取整,因为不足1公里不计费
  23.                 fPrice1 += n*0.7;  
  24.             }  
  25.         }  
  26. // 若时间大于10分钟,需要另外计算 fPrice2
  27. if(nTime>10)  
  28.         {  
  29.             n = (nTime-10)/3;  // 隐式取整,因为不足3分钟不计费
  30.             fPrice2 += n*1.4;  
  31.         }  
  32. // 打印两种计费方式产生的费用值中的较大值
  33.         printf("%.1f", fPrice1>fPrice2?fPrice1:fPrice2);  
  34.     }  
  35. return 0;  
  36. }  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习算法与Python学习

Python技巧 101:这17个骚操作你都Ok吗

Python 是一门非常优美的语言,其简洁易用令人不得不感概人生苦短。在本文中,作者 Gautham Santhosh 带我们回顾了 17 个非常有用的 Pyt...

11840
来自专栏Albert陈凯

scala的option和some

对于学习 Scala 的 Java™ 开发人员来说,对象是一个比较自然、简单的入口点。在 本系列 前几期文章中,我介绍了 Scala 中一些面向对象的编程方法,...

29550
来自专栏斑斓

深入探索Scala的Option

程序员最深恶痛绝并力求避免的异常是NullPointerException,很不幸,我们往往又会忽略这个错误。不知是谁设计了Null这样的对象。我在文章《并非N...

34370
来自专栏阿凯的Excel

职场不得不知的排序技巧

排序是工作中最常用的功能,今天和大家分享一些排序的冷门应用,有多冷?就是在南方没暖气的那种冷! 不得不知的排序应用现在开始: 一:自定义序列 通常我们对文本...

31180
来自专栏nummy

简单工厂模式

简单工厂模式又叫静态工厂方法模式,工厂模式家族中最简单的一种模式。这个模式的基本工作方式: 通过一个工厂来决定创建哪种具体的产品实例。

7010
来自专栏WeaponZhi

AI 学习之路——轻松初探 Python 篇(三)

这是「AI 学习之路」的第 3 篇,「Python 学习」的第 2 篇 Python 字符串使用和 C 语言比较类似,但还有一些我们值得注意的地方需要关注,用这...

36160
来自专栏斑斓

从map函数引发的讨论

只要你用心,一个细小问题可以引起对一系列设计原则的思考与回味。软件设计与开发技能就是这样通过不停“反刍”与思索而磨砺出来的。当然,对一些实践案例进行升华,进而抛...

39190
来自专栏程序人生

来来来,咱们元编程入个门

前一篇文章竟然被很多人批「干货太少」 —— 一看你们就没有看过 Rich 他老人家的 Hammock Driven Development(我很久前推荐过滴),...

352100
来自专栏数据结构与算法

P1049 装箱问题

题目描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30,每个物品有一个体积(正整数)。 要求n个物品中,任取若干个装入箱...

31050
来自专栏Android知识点总结

1.计算机编程通之字节与数据类型

18070

扫码关注云+社区

领取腾讯云代金券