前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2015 华为 校招回忆录---篇(上)

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

作者头像
bear_fish
发布2018-09-20 16:50:42
6480
发布2018-09-20 16:50:42
举报

本文由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. }  
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014年12月31日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面:
  • 1、输出重复的英文字符
  • 2、笨笨熊搬家打包篇
  • 3、出租车计费(测试模拟题)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档