顺丰科技2017年秋招笔试题“幸运数”

可能超时了,指AC成功10%,优化怎么减少循环~

import sys
if __name__=="__main__":
    num=int(raw_input())
    res=0
    while(num>0):
        tmp=str(num)
        for k in xrange(len(tmp)):
            if(tmp[k]!="4" ) and (tmp[k]!="7"):
                break
            if(tmp[k]=="4") or (tmp[k]=="7"):
                    if(k==len(tmp)-1):
                        res=res+1
        num=num-1
    if(res>=(10*10*10*10*10*10*10*10*10)):
        res=res/(10*10*10*10*10*10*10*10*10+7)
    print res

优化解题思路:
根据输入数num,把它转换成字符串,算其长度;
如输入9,其长度为1,f(1)=2 幸运数有:4、7
如输入99,其长度2,f(2)=2^2+f(1) 幸运数有:4、7、44、47、74、77
如输入999,其长度为3,f(3)=2^3+f(2) 幸运数有:4、7、44、47、74、77 444 447 474 477 777 744 747 774

len(num)
f(len(num)-1)=2^(len(num)-1)+f(len(num)-2)递归方法

例子1:如找65534的幸运数,65534>9999,而9999的幸运数有f(4)=2^4+f(3)个,
65534最大位为6在4与7之间,故最大位的幸运数只能填4,后面空格可以填4、或7,故有1*2*2*2*2=16
65534的幸运数个数为16+2^4+f(3)=16+16+14=46个

例子2:如找35534的幸运数,最大位值3小于4,故五位数的幸运数没有,35534的幸运数个数为0+2^4+f(3)=16+14=30个

例子3:如找85534的幸运数,最大位为8大于7,故最大位的幸运数能填4或7,后面四位数可以填4、或7,故有2*2*2*2*2=32
85534的幸运数个数为32+2^4+f(3)=32+16+14=62个

例子4:如果最大位等于4或7,则因比较其次大位的值与4、7大小,同上最大位与4、7的情况;如48534,1*2*2*2*2=16 五位数的幸运数第一个空格只能填4、由于次位数为8大于7,次位数可填4、7后面均是如此,故有16个五位数的幸运数;
48534的所有幸运数有:16+2^4+f(3)=16+16+14=46个
44434的所有幸运数有:1*1*1*0*1+2^4+f(3)=0+16+14=30个
77434的所有幸运数有:1*2*2*2*2+1*1*2*2*2+2^4+f(3)=16+8+16+14=54个
77434构五位数幸运数时,最大位为4,后面可为4、7故有1*2*2*2*2=16种
最大位为7,后面位为4,故有1*1*2*2*2=8
最大位为7,后面位为7,判断第三位值为4,第四位为3小于4,故1*1*1*0* 1=0种

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值