编程之美1

这周有华为编程竞赛,最近就看下算法,晚上看了会编程之美,依次小结下:

1,.1 CPU占用率问题

第一种解法跟以前初学C时做的一个模拟时钟有点像,用空循环来实现,这里只是和Sleep 函数交替使用,后面各种看不懂,windows编程一点不会,不知道何时能如作者所说在简历里加上“精通windows了”。

1.2象棋的将帅问题,要求枚举合法的所有情况,只能用一个变量。

解法一使用1B的空间,前4位和后四位分别表示A,B的位置,然后就是一个二重循环。

解法二比较简单,将帅所有的可能只有81种,对应的变化范围是(1——9)*(1——9),作者很聪明地把1——9这个范围用81/9和81%9表示出来,而且也不用拘泥所谓的二重循环,i=81,i--的过程就会包括所有的情况。

解法三纯粹是非主流,耍聪明了。。。。。

1.3烙饼翻转问题,程序没细看,剪枝和递归要好好看看了。

1.4买书折扣问题

解法一动态规划来解,F(x1,x2,x3,x4,x5),书之间没有区别,可以随便调换位置排序,令x1>=x2>=x3>=x4>=x5,F=min{8*5*0.75+F(x1-1,x2-1,x3-1,x4-1,x5-1),..........]

解法二贪心,由于折扣2*K4>K3+K5,所以先依照尽量组合多本的方案求解后,把min{x3,x5}对的方案变成4卷的即可。

1.5机器故障问题,数据量很大,除了某个数据出现一次,其余的均出现2次,要求快速找出出现一次的数据

解法三 利用异或的性质可把空间复杂度降低至O(1),X⊕X=0,X⊕0=1。

如果2个数据出现1次,则结果是这2个数据的异或之和,把结果按二进制展开可以比较容易地求出缺失的2个数据。

解法四找出隐藏的数量关系,分别构造2个方程,得到a+b=?和a²+b²=?很容易求出了。

还有前几天看到1个题目1,3,9,27,81这5个数字可以表示出1——121的所有数字,要求输入A,输出表示方案。提到这个只是为了提醒自己对于一个题目,要知其然知其所以然,看完一个3进制的答案,感觉很巧妙,比如60写成3进制是(2020),进一步写成(1  -1  1 -1 0),结果就出来60=81-27+9-3,解法容易看懂,可是为什么是3进制,不是其他呢,再看后面原理,对于这个输出方案我们用1,-1,0 分别代表符号为正负和不参与,一个数共有3种状态,表示成三进制后,0好说,不管,1表示为正,2处理一下,向前进一位,同时本位变为-1,正好对应减,很精妙的解法!

还有一个面试题,进一次房间区分门外的开关对应房间内的灯,灯有暗灭之分,最多只能区分开2盏,要区分3盏灯就要有3个变量,3个维度,对,要的就是这句话,我们经常迷迷糊糊做对了题目,却没有进行理性的分析,话从别人口中说出我们恍然大悟,其实不是题目难,而是我们没有认真思考过,没有理性思考过。

 

第一天,先写这么多,坚持才是王道,效率才是王道,动手才是王道,洞察才是王道,以上排名不分前后,缺一不可,好了,睡觉。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值