鱼C论坛

 找回密码
 立即注册
查看: 5123|回复: 38

[已解决]Python:每日一题 346

[复制链接]
发表于 2020-3-7 22:47:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天的题目:


给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。

一个数字可能有多个翻译。实现一个函数,用来计算一个数字有多少种不同的翻译方法。

示例 1:

输入:12258
输出:5
解释:12258 有 5 种不同的翻译,分别是 "bccfi", "bwfi", "bczi", "mcfi" 和 "mzi"


欢迎大家一起答题!
最佳答案
2020-3-7 23:49:20
  1. basis = [str(i) for i in range(26)]
  2. def solve(s):
  3.     if type(s) is int:
  4.         s = str(s)
  5.     if len(s) <= 1:
  6.         return 1
  7.     m = len(s)//2
  8.     l = solve(s[:m])
  9.     r = solve(s[m:])
  10.     if s[m-1]+s[m] in basis:
  11.         e = solve(s[:m-1])*solve(s[m+1:])
  12.     else:
  13.         e = 0
  14.     return l*r + e
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-7 23:49:20 | 显示全部楼层    本楼为最佳答案   
  1. basis = [str(i) for i in range(26)]
  2. def solve(s):
  3.     if type(s) is int:
  4.         s = str(s)
  5.     if len(s) <= 1:
  6.         return 1
  7.     m = len(s)//2
  8.     l = solve(s[:m])
  9.     r = solve(s[m:])
  10.     if s[m-1]+s[m] in basis:
  11.         e = solve(s[:m-1])*solve(s[m+1:])
  12.     else:
  13.         e = 0
  14.     return l*r + e
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-8 00:03:05 | 显示全部楼层

大佬,这是你自己想的吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 01:39:40 | 显示全部楼层
本帖最后由 flamezyy 于 2020-3-8 12:03 编辑
  1. def switch(num):  
  2.     num = str(num)
  3.     length = len(num)
  4.     if length < 3:
  5.         if int(num) in range(10,26):
  6.             return 2
  7.         else:
  8.             return 1
  9.     elif int(num[:2]) in range(10,26):
  10.         return(switch(num[1:]) + switch(num[2:]))      
  11.     else:
  12.         return(switch(num[1:]))
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 06:32:23 | 显示全部楼层
本帖最后由 ouyunfu 于 2020-3-8 06:44 编辑
  1. def f346(n:int)->int:
  2.     s=str(n)
  3.     global res
  4.     res=0
  5.     def f(s):
  6.         global res
  7.         if len(s)==1:
  8.             res+=1
  9.         elif len(s)==2:
  10.             res+=1
  11.             if 10<=int(s)<=25:
  12.                 res+=1
  13.         else:
  14.             f(s[1:])
  15.             if 10<=int(s[0:2])<=25:
  16.                 f(s[2:])
  17.         return res
  18.     return f(s)
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 10:01:42 | 显示全部楼层
  1. def solve(num):
  2.     if not isinstance(num, int):
  3.         return None
  4.    
  5.     s = str(num)
  6.     ls = len(s)
  7.     dp = [[0] * 2 for i in range(ls)]
  8.     # dp[i][0]表示从左到右第i(下标)位如果不和前一位结合 有多少种可能
  9.     # dp[i][1]表示从左到右第i(下标)位如果和前一位结合 有多少种可能   
  10.     # 对于dp[i][0]无论前面状态如何 每一种dp[i - 1]*的状态都会有dp[i][0]的状态
  11.     # 所以dp[i][0] = dp[i - 1][0] + dp[i - 1][1]
  12.     # 对于dp[i][1]如果与前一位可以结合 此时前一位不能和更前一位结合 故 dp[i][1] = dp[i - 1][0]
  13.     # 如果当前位与前一位无法结合 则dp[i][1] = 0   
  14.     # i=0时无法与前面结合 dp[0][0] = 1 dp[0][1] = 0
  15.     # 结果为dp[ls-1][0] + dp[ls - 1][1]
  16.     dp[0][0] = 1
  17.     for i in range(1, ls):
  18.         dp[i][0] = dp[i - 1][0] + dp[i - 1][1]
  19.         if 0 <= int(s[i - 1] + s[i]) < 26:
  20.             dp[i][1] = dp[i-1][0]
  21.     return dp[ls - 1][0] + dp[ls - 1][1]
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 10:21:25 | 显示全部楼层
本帖最后由 塔利班 于 2020-3-8 10:32 编辑
  1. def f346(x):
  2.     s=str(x)
  3.     l=len(s)
  4.     t=[1]+[0]*l
  5.     t[1]=1
  6.     b=[str(e) for e in range(10,26)]
  7.     for i in range(2,l+1):
  8.         t[i]=t[i-1]+(s[i-2:i] in b)*t[i-2]
  9.     return t[l]
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 10:43:34 | 显示全部楼层
本帖最后由 Croper 于 2020-3-8 19:42 编辑
  1. def func346(n):
  2.     l=[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842, 10610209857723, 17167680177565, 27777890035288, 44945570212853, 72723460248141, 117669030460994, 190392490709135, 308061521170129, 498454011879264, 806515533049393, 1304969544928657, 2111485077978050, 3416454622906707, 5527939700884757, 8944394323791464, 14472334024676221, 23416728348467685, 37889062373143906, 61305790721611591, 99194853094755497, 160500643816367088, 259695496911122585, 420196140727489673, 679891637638612258, 1100087778366101931, 1779979416004714189, 2880067194370816120, 4660046610375530309, 7540113804746346429, 12200160415121876738, 19740274219868223167, 31940434634990099905, 51680708854858323072, 83621143489848422977, 135301852344706746049, 218922995834555169026, 354224848179261915075, 573147844013817084101]
  3.     def fib(n):
  4.         while len(l)<n+1:
  5.             l.append(l[-1]+l[-2])
  6.         return l[n]

  7.     b=[str(n) for n in range(10,26)]
  8.     t,sz=0,str(n)
  9.     ret=1
  10.     for i in range(1,len(sz)+1):
  11.         if i==len(sz) or not sz[i-1:i+1] in b:
  12.             ret*=fib(t)
  13.             t=0
  14.         else:
  15.             t+=1
  16.     return ret
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 11:30:50 From FishC Mobile | 显示全部楼层
本帖最后由 寻风 于 2020-3-8 16:42 编辑

硬给玩成了数学题,希望不要错

  1. from math import sqrt
  2. def Feb(n):
  3.     a=(1/sqrt(5))*((((1+sqrt(5))/2)**(n+1))-(((1-sqrt(5))/2)**(n+1)))
  4.     return int(a)
  5. def fun346():
  6.     num = input()
  7.     list1=[0]
  8.     end = 1
  9.     l = len(num)
  10.     for i in range(l-1):
  11.         if 25 < int(num[i:i+2]):
  12.             list1.append(i+1)
  13.     list1.append(l)
  14.     for i in range(len(list1)-1):
  15.         a=list1[i+1]-list1[i]
  16.         end*=Feb(a)
  17.     print(end)
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 11:33:18 From FishC Mobile | 显示全部楼层
Croper 发表于 2020-3-8 10:43

斐波那契数列,我们撞思路了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 14:00:50 From FishC Mobile | 显示全部楼层
fan1993423 发表于 2020-3-8 00:03
大佬,这是你自己想的吗?


不是大佬...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 14:50:47 | 显示全部楼层
本帖最后由 Windypper 于 2020-3-8 14:55 编辑

希望沒bug
  1. basis = [str(i) for i in range(10, 26)]
  2. def F346(num):
  3.     n = str(num)
  4.     count = 1
  5.     if len(n) <=3:
  6.         for i in range(len(n)-1):
  7.             if n[i:i + 2] in basis:
  8.                 count += 1
  9.         return count
  10.     else:
  11.         for i in range(len(n) - 1):
  12.             if n[i:i + 2] in basis:
  13.                 count += F346(n[i + 2:])
  14.         return count
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 15:20:39 | 显示全部楼层
  1. def fun346(num : int):
  2.     s = str(num)
  3.     Pway = 0
  4.     Cway = 1
  5.     Pnum = ""
  6.     for Cnum in s:
  7.         tmp = Pway
  8.         Pway = Cway
  9.         Cway = int(Cnum > "0") * Cway + (9 < int(Pnum + Cnum) < 26) * tmp
  10.         Pnum = Cnum
  11.     return Cway
复制代码


又是一道之前刷题的时候做过的题。。。。。

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 16:00:01 | 显示全部楼层
大家都这么厉害啊,我没办法 只能暴力一点了 当然我这里默认 连续1和2的个数不能太大 否则 递归就超了
  1. def fun346(num):
  2.     def ZeroSplit(num):
  3.         if num in fenCount:
  4.             return fenCount[num]
  5.         else:
  6.             if num < 0:
  7.                 return 0
  8.             elif num == 0:
  9.                 fenCount[0]=1
  10.             else:
  11.                 fenCount[num] = ZeroSplit(num-1)+ZeroSplit(num-2)
  12.             return fenCount[num]

  13.     string = str(num)
  14.     sample = [['1','2'],['0','3','4','5'],['6','7','8','9']]
  15.     fenCount = {}
  16.    
  17.     status = []
  18.     many = []
  19.     for pre in range(0,3):
  20.         if string[0] in sample[pre]:
  21.             break
  22.     count = 0
  23.     for each in string:
  24.         if each in sample[pre]:
  25.             count += 1
  26.         else:
  27.             status.append(pre)
  28.             many.append(count)
  29.             for pre in range(0,3):
  30.                 if each in sample[pre]:
  31.                     break
  32.             count = 1
  33.     else:
  34.         status.append(pre)
  35.         many.append(count)
  36.     if 0 not in status:
  37.         return 1
  38.     result = 1
  39.     M = len(status)
  40.     start = status.index(0)
  41.     first = start
  42.     for index in range(start,M):
  43.         if index < M - 1:
  44.             if status[index + 1] == 0:
  45.                 #进行计算
  46.                 special = sum(many[:(first+1)]) - 1
  47.                 if string[special] == '1':
  48.                     result = result * (ZeroSplit(many[first]-2)+2*ZeroSplit(many[first]-1))
  49.                 else:
  50.                     if status[first + 1] == 1:
  51.                         result = result * (ZeroSplit(many[first]-2)+2*ZeroSplit(many[first]-1))
  52.                     else:
  53.                         result = result * ZeroSplit(many[first])
  54.                 first = index + 1
  55.             else:
  56.                 pass
  57.         else:
  58.             if status[index] == 0:
  59.                 result = result * ZeroSplit(many[-1])
  60.             else:
  61.                 special = sum(many[:(first+1)]) - 1
  62.                 if string[special] == '1':
  63.                     result = result * (ZeroSplit(many[first]-2)+2*ZeroSplit(many[first]-1))
  64.                 else:
  65.                     if status[first + 1] == 1:
  66.                         result = result * (ZeroSplit(many[first]-2)+2*ZeroSplit(many[first]-1))
  67.                     else:
  68.                         result = result * ZeroSplit(many[first])
  69.     return result
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 19:14:13 | 显示全部楼层
本帖最后由 Geoffreylee 于 2020-3-8 19:16 编辑
  1. # 构造斐波那契数列
  2. def fib(n):
  3.     a, b = 0, 1
  4.     while True:
  5.         a, b, n = b, a+b, n-1
  6.         if n == 0:
  7.             return b


  8. def f_346(string: str):
  9.     over_25_count = 0
  10.     # 遍历相邻两个字符组成的数字,记录有多少个数字大于25
  11.     for i in range(len(string)-1):
  12.         over_25_count += 1 if int(string[i:i+2]) > 25 else over_25_count
  13.     # 返回string长度减over_25_count对应的斐波那契数
  14.     return fib(len(string)-over_25_count)

  15. print(f_346('12258'))
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
zltzlt + 2 + 2

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 20:09:40 | 显示全部楼层
本帖最后由 蒋博文 于 2020-3-8 20:11 编辑

请求楼主测试(还好我做过
  1. def fun346(s):
  2.     if isinstance(s,int):
  3.         s=str(s)
  4.     a = 0
  5.     b = 1
  6.     for i in range(len(s)):
  7.         if s[i - 1] == '1' or s[i - 1] == '2' and s[i] < '6':
  8.             c = a + b
  9.         else:
  10.             c = b
  11.         a = b
  12.         b = c
  13.     return c
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 20:23:45 | 显示全部楼层
楼主,以后能不能多举一点例子,方便检查
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 20:29:33 | 显示全部楼层
蒋博文 发表于 2020-3-8 20:09
请求楼主测试(还好我做过 )

hello,可以写一下说明吗,我学习学习。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 20:35:53 | 显示全部楼层
suchocolate 发表于 2020-3-8 20:29
hello,可以写一下说明吗,我学习学习。
  1. def fun346(s):
  2.     if isinstance(s,int):
  3.         s=str(s)
  4.     a = 0
  5.     b = 1
  6.     for i in range(len(s)):
  7.         if s[i - 1] == '1' or s[i - 1] == '2' and s[i] < '6':# 判断是否可以和前面的数字合并
  8.             c = a + b
  9.         else:
  10.             c = b
  11.         a = b
  12.         b = c
  13.     return c
复制代码

其实只要用斐波那契数列的思想来做就可以了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-8 20:38:19 | 显示全部楼层
suchocolate 发表于 2020-3-8 20:29
hello,可以写一下说明吗,我学习学习。


https://baike.so.com/doc/5389470-5626050.html
这里面有斐波那契数列的公式和思想讲解,看完后就应该明白了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-1 11:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表