鱼C论坛

 找回密码
 立即注册
查看: 6289|回复: 45

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

[复制链接]
发表于 2020-1-18 21:14:52 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 zltzlt 于 2020-1-18 21:25 编辑

今天的题目:


给定正整数 n,返回小于等于 n 且具有至少 1 位重复数字的正整数的个数。

示例 1:

输入:20
输出:1
解释:具有至少 1 位重复数字的正数(<= 20)只有 11。
示例 2:

输入:100
输出:10
解释:具有至少 1 位重复数字的正数(<= 100)有 11,22,33,44,55,66,77,88,99 和 100。
示例 3:

输入:1000
输出:262


欢迎大家一起答题!
最佳答案
2020-1-18 21:32:13
本帖最后由 TJBEST 于 2020-1-19 15:34 编辑

又写了一个长代码,不知道速率如何
  1. def fun309(n):
  2.     def splitNum(n):
  3.         res = []
  4.         while n:
  5.             re = n % 10
  6.             n = n // 10
  7.             res.append(re)
  8.         return list(reversed(res))
  9.     def ByNine(index):
  10.         res = 9
  11.         for k in range(0,index):
  12.            res= res * (9 - k)
  13.         return res
  14.     def MulByall(start,end):#start >= end <表示 到个位了
  15.         res = 1
  16.         for i in range(end , start + 1):
  17.             res = res * i
  18.         return res
  19.     def firstNum(num,arr):
  20.         res = 0
  21.         for i in range(0,num):
  22.             if i not in arr:
  23.                 res = res + 1
  24.         return res
  25.             

  26.     NotHave_Nine = [9]#常数 <= 999..999 的不重复个数
  27.     for i in range(1,10):
  28.         temp = NotHave_Nine[len(NotHave_Nine) - 1] + ByNine(i)
  29.         NotHave_Nine.append(temp)
  30.     numList = splitNum(n)
  31.     N = len(numList)#位数
  32.     if N == 1:
  33.         return 0
  34.     if N >= 11:
  35.         return n - NotHave_Nine[9]
  36.     arr = []#记录已处理的数
  37.     isnot = NotHave_Nine[N - 2]
  38.    
  39.     if numList[0] == 1:
  40.         arr.append(1)
  41.     else:
  42.         isnot += (numList[0] - 1) * MulByall(9,11 - N)
  43.         arr.append(numList[0])
  44.    
  45.     state = 1
  46.     for i in range(1,N - 1):
  47.         temp = numList[i]
  48.         isnot += firstNum(temp,arr) * MulByall(9 - i,11 - N)
  49.         if temp in arr:
  50.             state = 0
  51.             break
  52.         else:
  53.             arr.append(temp)
  54.     if state == 1:
  55.         isnot += firstNum(numList[N - 1] + 1,arr)
  56.     else:
  57.         pass  
  58.     return n - isnot
复制代码

   

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2020-1-18 21:25:14 | 显示全部楼层
题目少写了俩字儿吧
给定正整数 n,返回小于等于 n 且具有至少 1 位重复数字的正整数

应该是正整数的个数。。不然我直接return一个11就行了。。。。

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
zltzlt + 1 + 1 感谢指出,写漏了

查看全部评分

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

使用道具 举报

发表于 2020-1-18 21:25:45 | 显示全部楼层
  1. def func(n):
  2.     return sum([1 for i in range(11, n + 1) if len(set(str(i))) < len(str(i))])
复制代码

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-1-18 21:27:43 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-18 21:32:13 | 显示全部楼层    本楼为最佳答案   
本帖最后由 TJBEST 于 2020-1-19 15:34 编辑

又写了一个长代码,不知道速率如何
  1. def fun309(n):
  2.     def splitNum(n):
  3.         res = []
  4.         while n:
  5.             re = n % 10
  6.             n = n // 10
  7.             res.append(re)
  8.         return list(reversed(res))
  9.     def ByNine(index):
  10.         res = 9
  11.         for k in range(0,index):
  12.            res= res * (9 - k)
  13.         return res
  14.     def MulByall(start,end):#start >= end <表示 到个位了
  15.         res = 1
  16.         for i in range(end , start + 1):
  17.             res = res * i
  18.         return res
  19.     def firstNum(num,arr):
  20.         res = 0
  21.         for i in range(0,num):
  22.             if i not in arr:
  23.                 res = res + 1
  24.         return res
  25.             

  26.     NotHave_Nine = [9]#常数 <= 999..999 的不重复个数
  27.     for i in range(1,10):
  28.         temp = NotHave_Nine[len(NotHave_Nine) - 1] + ByNine(i)
  29.         NotHave_Nine.append(temp)
  30.     numList = splitNum(n)
  31.     N = len(numList)#位数
  32.     if N == 1:
  33.         return 0
  34.     if N >= 11:
  35.         return n - NotHave_Nine[9]
  36.     arr = []#记录已处理的数
  37.     isnot = NotHave_Nine[N - 2]
  38.    
  39.     if numList[0] == 1:
  40.         arr.append(1)
  41.     else:
  42.         isnot += (numList[0] - 1) * MulByall(9,11 - N)
  43.         arr.append(numList[0])
  44.    
  45.     state = 1
  46.     for i in range(1,N - 1):
  47.         temp = numList[i]
  48.         isnot += firstNum(temp,arr) * MulByall(9 - i,11 - N)
  49.         if temp in arr:
  50.             state = 0
  51.             break
  52.         else:
  53.             arr.append(temp)
  54.     if state == 1:
  55.         isnot += firstNum(numList[N - 1] + 1,arr)
  56.     else:
  57.         pass  
  58.     return n - isnot
复制代码

   

评分

参与人数 1荣誉 +10 鱼币 +10 收起 理由
zltzlt + 10 + 10 32 ms

查看全部评分

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

使用道具 举报

发表于 2020-1-18 21:43:43 | 显示全部楼层
  1. a = int(input("输入:"))
  2. num = 0
  3. for i in range(a+1):
  4.     b = list(str(i))
  5.     for e in b:
  6.         if b.count(e) > 1:
  7.             num += 1
  8.             break
  9.             
  10. print(num)
复制代码

评分

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

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-1-18 21:45:04 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-18 22:01:15 | 显示全部楼层
楼主最近高产呐
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-18 22:55:57 | 显示全部楼层
  1. count=0
  2. for i in range(100+1):
  3.     if len(str(i))>len(set(str(i))):
  4.         count+=1
  5. print(count)
复制代码

直接用set这个特使的函数,完美
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-18 23:08:09 | 显示全部楼层
本帖最后由 Croper 于 2020-1-18 23:12 编辑

今天的有点绕啊
  1. def func(n):
  2.     n+=1
  3.     l=[0]
  4.     for i in range(len(str(n))-2):
  5.         l.append(l[-1]*10+(9*10**i-l[-1])*(i+1))
  6.     prev=sum(l)

  7.     l=[int(c) for c in str(n)]
  8.     n=l[0]-1
  9.     p,q=0,n
  10.     same_digit=False
  11.     for i in range(1,len(l)):
  12.         n=n*10+l[i]
  13.         t1=p*10+q*i
  14.         t2=n-t1
  15.         if same_digit:
  16.             t2-=l[i]
  17.             t1+=l[i]
  18.         else:
  19.             for j in l[:i]:
  20.                 if j<l[i]:
  21.                     t2-=1
  22.                     t1+=1
  23.         if l[i] in l[:i]:
  24.             same_digit=True
  25.         p,q=t1,t2
  26.     return p+prev
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-1-19 01:27:22 | 显示全部楼层
初学Python 不会什么高级方法
大数超时的问题暂时没有什么优化思路

  1. n = int(input("Input N: "))
  2. cnt = 0
  3. passthisnum = False

  4. #检查 11 ~ n 范围内的整数
  5. for i in range(11,n+1):
  6.     str_i = str(i)
  7.     #对当前第 i 个整数的每一位进行判断
  8.     for j in range(len(str_i)):
  9.         if passthisnum == True :
  10.             passthisnum = False
  11.             break
  12.         temp = str_i[j]
  13.         #判断第 j 位后面是否有与第 j 位相同的数字
  14.         for k in range(j+1,len(str_i)):
  15.             if  temp == str_i[k]:
  16.                 cnt += 1
  17.                 #如果有相同则需要标记跳过此数
  18.                 #否则在处理如 999、10000
  19.                 #这种三个相同数字时会产生重复计数
  20.                 passthisnum = True
  21.                 #print(str_i)
  22.                 break
  23. print("cnt:",cnt)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-1-19 01:38:50 | 显示全部楼层
深海中燃烧 发表于 2020-1-19 01:27
初学Python 不会什么高级方法
大数超时的问题暂时没有什么优化思路

Input N: 750000
cnt: 618390
不知道答案对不
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-19 09:27:53 | 显示全部楼层
回帖的时候怎么可以贴上好看的代码块啊?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-19 09:32:47 | 显示全部楼层
def fun309(x):
    if x<=10:
        return 0
    re = 0
    for i in range(11,x+1):
        k = str(i)
        if len(set(k)) < len(k):
            re += 1
    return re

if __name__ == '__main__':
    print(fun309(1000000))

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-1-19 10:22:48 | 显示全部楼层
我还是先好好学习前面的,在不久的以后,我就可以答题了,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-19 14:53:56 | 显示全部楼层

U`5M_4_T0(~QNY}0Q~7JXOH.png
没有超时啊?
我运行了很多次都是1秒到2秒的时间。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-19 14:56:50 | 显示全部楼层
伏惜寒 发表于 2020-1-19 14:53
没有超时啊?
我运行了很多次都是1秒到2秒的时间。

超时应该是超过题目限定的时间,而不是用了多少时间
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-19 14:57:32 | 显示全部楼层
hrp 发表于 2020-1-19 14:56
超时应该是超过题目限定的时间,而不是用了多少时间

题目没给限定时间啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-19 15:38:22 | 显示全部楼层
伏惜寒 发表于 2020-1-19 14:57
题目没给限定时间啊

这个是拿到指定的平台来判定的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-19 15:42:12 | 显示全部楼层
楼主写完了,在五楼,您测试一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-16 10:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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