牛客真题编程——day10

编译环境:c++

1、生成格雷码

描述

在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同, 则称这种编码为格雷码(Gray Code),请编写一个函数,使用递归的方法生成N位的格雷码。

给定一个整数n,请返回n位的格雷码,顺序为从0开始。

算法思想:

根据格雷码的特性,不难发现,N位格雷码就是在N-1位生成的格雷码的前面加上1位的0或者1,并且个数为2的N个:前2的N-1个和后2的N-1个的第N-1位对称,都是N-1位生成的格雷码,即将N-1位生成的格雷码+0/1正逆序输出即可。据此设计递归函数getGray,当N为1时,格雷码为0和1。注意题目的输出刚好也要返回前N次递归生成的格雷码。

代码部分实现:

2、zj2 编程题1

描述

有三只球队,每只球队编号分别为球队1,球队2,球队3,这三只球队一共需要进行 n 场比赛。现在已经踢完了k场比赛,每场比赛不能打平,踢赢一场比赛得一分,输了不得分不减分。已知球队1和球队2的比分相差d1分,球队2和球队3的比分相差d2分,每场比赛可以任意选择两只队伍进行。求如果打完最后的 (n-k) 场比赛,有没有可能三只球队的分数打平。



算法思想:

    题目只是给出了差值,但是没有给出差值的正负,所以可以分为四种情况分别讨论。同时根据三队得分相加=k,ab差值为+-d1,bc差值为+-d2方程思想来分情况穷举。当a<0,b<0,c<0;n 不是 3 的倍数时,一定不满足条件。分类1:a<b<c时,此时a+b+c=a+(a+d1)+(a+d1+d2)=3x1+2d1+d2=k,有x1=(k-2*d1-d2)/3,显然,要追平则需要满足剩余场次n-k大于等于(2*d2+d1),同时多出来的场次要能满足同时分配给三队。其他三种情况同理,按d1d2正负分类讨论。

代码部分实现:

3、DNA序列

描述:

牛牛又从生物科研工作者那里获得一个任务,这次牛牛需要帮助科研工作者从DNA序列s中找出最短没有出现在DNA序列s中的DNA片段的长度。
例如:s = AGGTCTA

序列中包含了所有长度为1的('A','C','G','T')片段,但是长度为2的没有全部包含,例如序列中不包含"AA",所以输出2。

注:长度为2的全部DNA片段有"AA"、"AC"、"AG"、"AT"、"CA"、"CC"、"CG"、"CT"、"GA"、"GC"、"GG"、"GT"、"TA"、"TC"、"TG"和"TT",共16种。

算法思想:

    充分利用c++的库函数,接收到s字符串后,从长度为1开始截取子字符串,然后放到一个集合中去,因为因为元素键在集合中是唯一的,所以插入操作首先检查给定键是否已存在于集合中,相当于去重。此时只需要判断集合中元素的个数是否满足包含长度为i的所有DNA片段,即size要大于4的i次方。

代码部分实现:

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值