华为软件工程师

 

================【华为软件笔试题1】===================   

用C语言写一个递归算法求N!;   

给一个C的函数,关于字符串和数组,找出错误;   

防火墙是怎么实现的?   

你对哪方面编程熟悉?

================【华为软件笔试题2】===================

题目不是很难,但是非常基础。前面几道单选题都是数据结构的题大概包括了树,链表、队列、几中排序的比较等,后面就是算法题了。考了计算时间复杂度以及模式匹配。再后面是操作系统的题有一个问的的死锁的必要条件是什么,还有一个是关于页式存储的。一道数据库的题问的是更新数据的命令是什么。 再下面就是第二道大题了,多选。

第一个问的是下面四个图中哪些是平衡二叉树。后面有几道是JAVA的基础知识题。他是给你一些程序问哪些有错。还记得有一道是单向链表和有一道是双向链表。还有一个操作系统的题。 第三大题是改错题。就是一些JAVA的题目。每一个是考继承;每二个考文件输入操作;第三个考线程的,没有做出来。对这个没有研究。 第四大题是程序题。每一题:给你一个整型的数组,让你循环右移。时间复杂度必须在O(N)以内,空间复杂度越小越好。

每二题:给你一个整型的数组,求每二大的数。相同的不算。比如:88,88,88,88这样一个数组就没有第二大的。比如:88,88, 22,11 第二大的数就是22.

 

华为软件工程笔试题

华为软件工程笔试题

写一个程序, 要求功能:求出用1,2,5这三个数不同个数组合的和为100的组合个数。如:100个1是一个组合,5个1加19个5是一个组合。。。。 请用C++语言写。

答案:最容易想到的算法是:设x是1的个数,y是2的个数,z是5的个数,number是组合数注意到0=x=100,0=y=50,0=z=20,所以可以编程为:number=0;for (x=0; x=100; x++)for (y=0; y=50; y++)for (z=0; z=20; z++)if ((x+2*y+5*z)==100)number++;coutnumberendl;上面这个程序一共要循环100*50*20次,效率实在是太低了事实上,这个题目是一道明显的数学问题,而不是单纯的编程问题。

我的解法如下:因为x+2y+5z=100所以x+2y=100-5z,且z=20 x=100 y=50所以(x+2y)=100,且(x+5z)是偶数对z作循环,求x的可能值如下:z=0, x=100, 98, 96, ... 0z=1, x=95, 93, ..., 1z=2, x=90, 88, ..., 0z=3, x=85, 83, ..., 1z=4, x=80, 78, ..., 0......z=19, x=5, 3, 1z=20, x=0因此,组合总数为100以内的偶数+95以内的奇数+90以内的偶数+...+5以内的奇数+1,即为:(51+48)+(46+43)+(41+38)+(36+33)+(31+28)+(26+23)+(21+18)+(16+13)+(11+8)+(6+3)+1某个偶数m以内的偶数个数(包括0)可以表示为m/2+1=(m+2)/2某个奇数m以内的奇数个数也可以表示为(m+2)/2所以,求总的组合次数可以编程为:number=0;for (int m=0;m=100;m+=5){number+=(m+2)/2;}coutnumberendl;这个程序,只需要循环21次, 两个变量,就可以得到答案,比上面的那个程序高效了许多倍----只是因为作了一些简单的数学分析这再一次证明了:计算机程序=数据结构+算法,而且算法是程序的灵魂,对任何工程问题,当用软件来实现时,必须选取满足当前的资源限制,用户需求限制,开发时间限制等种种限制条件下的最优算法。而绝不能一拿到手,就立刻用最容易想到的算法编出一个程序了事

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值