鱼C论坛

 找回密码
 立即注册
楼主: zltzlt

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

[复制链接]
发表于 2020-3-18 14:59:05 | 显示全部楼层
稍微再等等,五点能提交新方案,暴力的已发。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 15:57:17 | 显示全部楼层
def n354(left:int, right:int):
    temp = []
    result = []
    for i in range(left, right+1):
        f = set(str(i))
        if i != 0 and '0' not in f:
            for j in f:
                if i % int(j) != 0:
                    temp.append(0)
                else:
                    temp.append(1)
            set1 = set(temp)
            temp.clear()

            if len(set1) == 1 and 1 in set1:
                result.append(i)
    return result

print(n354(1,10000))
               

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 16:18:14 | 显示全部楼层
def f354(left, right):
    list_num = []
    for num in range(left, right+1):
        str_num = str(num)
        if '0' not in str_num:
            for i in str_num:
                if num % int(i):
                    break
                else:
                    continue
            else:
                list_num.append(num)
        else:
            continue
    else:
        print(list_num)

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 18:03:20 | 显示全部楼层    本楼为最佳答案   
def q354(left,right):
    result = []
    for each in range(left,right+1):
        a, b= each%10, each
        while  b:
            if not a:
                break
            elif each%a:
                break
            else:
                b //= 10
                a = b%10
        else:
            result.append(each)
    return result

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 18:42:53 | 显示全部楼层
这个比暴力破解时间的40%左右 速度有点进步,但是代码超机长。累死我了
def fun354(left,right):
    def num2digital(num):
        result = []
        while num:
            result.append(num%10)
            num = num // 10
        result.reverse()
        return result
    def digital2num(arr):
        result = 0
        for each in arr:
            result = result * 10 + each
        return result
    def GongBei(iterobj):
        result = 1
        for each in iterobj:
            result = result*each//Gongyue(result,each)
        return result
    def Gongyue(a,b):
        if a<b:
            a,b = b,a
        while b:
            a,b = b,a%b
        return a
    def Ji():
        if m != M:
            if dic['bits']<M and dic['bits']>m:
                if dic['index'] < dic['bits'] - 1:
                    Deal(1,10,2,Ji)
                else:
                    Deal(1,10,2,Ji,True)
            elif dic['bits'] == M:
                if temp == right_arr[0:dic['index']]:
                    standard = right_arr[dic['index']]
                    if dic['index'] < dic['bits'] - 1:
                        Deal(1,standard+1,2,Ji)
                    else:
                        Deal(1,standard+1,2,Ji,True)
                else:
                    if dic['index'] < dic['bits'] - 1:
                        Deal(1,10,2,Ji)
                    else:
                        Deal(1,10,2,Ji,True)
            else:
                if temp == left_arr[0:dic['index']]:
                    standard = left_arr[dic['index']]
                    if dic['index'] < dic['bits'] - 1:
                        Deal(9,max([standard-1,0]),-2,Ji)
                    else:
                        Deal(9,max([standard-1,0]),-2,Ji,True)
                else:
                    if dic['index'] < dic['bits'] - 1:
                        Deal(1,10,2,Ji)
                    else:
                        Deal(1,10,2,Ji,True)
        else:
            if right_arr[0:dic['index']] == left_arr[0:dic['index']]:
                s1 = left_arr[dic['index']]
                s2 = right_arr[dic['index']]
                if dic['index'] < dic['bits'] - 1:
                    Deal((s1//2)*2+1,s2+1,2,Ji)
                else:
                    Deal((s1//2)*2+1,s2+1,2,Ji,True)
            else:
                if temp < right_arr[0:dic['index']] and temp > left_arr[0:dic['index']]:
                    if dic['index'] < dic['bits'] - 1:
                        Deal(1,10,2,Ji)
                    else:
                        Deal(1,10,2,Ji,True)
                elif temp == right_arr[0:dic['index']]:
                    standard = right_arr[dic['index']]
                    if dic['index'] < dic['bits'] - 1:
                        Deal(1,standard+1,2,Ji)
                    else:
                        Deal(1,standard+1,2,Ji,True)
                else:
                    standard = left_arr[dic['index']]
                    if dic['index'] < dic['bits'] - 1:
                        Deal(9,max([standard-1,0]),-2,Ji)
                    else:
                        Deal(9,max([standard-1,0]),-2,Ji,True)
    
    def Ou():
        if m != M:
            if dic['bits']<M and dic['bits']>m:
                if dic['index'] < dic['bits'] - 1:
                    Deal(1,10,1,Ou)
                else:
                    Deal(2,10,2,Ou,True)
            elif dic['bits'] == M:
                if temp == right_arr[0:dic['index']]:
                    standard = right_arr[dic['index']]
                    if dic['index'] < dic['bits'] - 1:
                        Deal(1,standard+1,1,Ou)
                    else:
                        Deal(2,standard+1,2,Ou,True)
                else:
                    if dic['index'] < dic['bits'] - 1:
                        Deal(1,10,1,Ou)
                    else:
                        Deal(2,10,2,Ou,True)
            else:
                if temp == left_arr[0:dic['index']]:
                    standard = left_arr[dic['index']]
                    if dic['index'] < dic['bits'] - 1:
                        Deal(9,max([standard-1,0]),-1,Ou)
                    else:
                        Deal(8,max([standard-1,0]),-2,Ou,True)
                else:
                    if dic['index'] < dic['bits'] - 1:
                        Deal(1,10,1,Ou)
                    else:
                        Deal(2,10,2,Ou,True)
        else:
            if right_arr[0:dic['index']] == left_arr[0:dic['index']]:
                s1 = left_arr[dic['index']]
                s2 = right_arr[dic['index']]
                if dic['index'] < dic['bits'] - 1:
                    Deal(max([s1,1]),s2+1,1,Ou)
                else:
                    Deal(max([2,((s1+1)//2)*2]),s2+1,2,Ou,True)
            else:
                if temp < right_arr[0:dic['index']] and temp > left_arr[0:dic['index']]:
                    if dic['index'] < dic['bits'] - 1:
                        Deal(1,10,1,Ou)
                    else:
                        Deal(2,10,2,Ou,True)
                elif temp == right_arr[0:dic['index']]:
                    standard = right_arr[dic['index']]
                    if dic['index'] < dic['bits'] - 1:
                        Deal(1,standard+1,1,Ou)
                    else:
                        Deal(2,standard+1,2,Ou,True)
                else:
                    standard = left_arr[dic['index']]
                    if dic['index'] < dic['bits'] - 1:
                        Deal(9,max([standard-1,0]),-1,Ou)
                    else:
                        Deal(8,max([standard-1,0]),-2,Ou,True)
    def Deal(start,end,step,func,mode = False):
        for each in range(start,end,step):
            temp.append(each)
            if mode == False:
                dic['index'] += 1
                func()
                temp.pop()
            else:
                Num = digital2num(temp)
                Div = GongBei(set(temp))
                if Num % Div == 0:
                    result.append(Num)
                temp.pop()
        dic['index'] -= 1
  
    if left == right:
        temp = num2digital(left)
        Div = GongBei(set(temp))
        if left % Div == 0:
            return [left]
        else:
            return []
    if right <= 10:
        return [i for i in range(left,min(right+1,10))]
    elif left < 10:
        result = [i for i in range(left,10)]
        left = 10
    else:
        result = []
    left_arr = num2digital(left)
    m = len(left_arr)
    right_arr = num2digital(right)
    M = len(right_arr)
    dic = {'index':0,'bits':0}
    if m!=M:
        for each in range(m,M+1):
            temp = []
            dic['bits']=each
            Ji()
            dic['index']=0
            Ou()
            dic['index']=0
    else:
        for i in range(1,m):
            if left_arr[0:i]!=right_arr[0:i]:
                break
        dic['bits']=m
        dic['index']=i-1
        temp = []
        temp.extend(left_arr[0:(i-1)])
        Ji()
        dic['index']=i-1
        temp = []
        temp.extend(left_arr[0:(i-1)])
        Ou()
    result.sort()
    return result

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 18:47:25 | 显示全部楼层
楼主,可能我的代码太长了,还需要审核 。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 19:17:06 | 显示全部楼层
来了,刚看到,写个无脑版本。
def day354(left, right):
  numberlist = []
  nnl = []
  for i in range(left ,right):
    numberlist.append(i + 1) 
  for i in range(len(numberlist)):
    number = numberlist[i]
    nlist = list(str(number))
    pass1 = 0
    for each in range(len(str(number))):
      if int(nlist[each]) == 0:
        pass1 += 1
      elif number % int(nlist[each]) == 0:
        pass1 += 1  
    if pass1 == len(str(number)):        
      nnl.append(number)
  print(nnl)    
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 19:18:51 | 显示全部楼层
fan1993423 发表于 2020-3-17 17:39
这道题思路很容易想到,但考虑到是效率题,所以还是要从效率入手。在323055,41520421这数据,我测了下是14 ...

10不是吗 ,我输1,10
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 19:27:03 | 显示全部楼层
小甲鱼de粉丝 发表于 2020-3-18 19:17
来了,刚看到,写个无脑版本。

我重发
def day354(left, right):
  if not(left < 1):
    numberlist = []
    nnl = []
    for i in range(left ,right):
      numberlist.append(i + 1) 
    for i in range(len(numberlist)):
      pass2 = 1
      number = numberlist[i]
      nlist = list(str(number))
      pass1 = 0
      for i2 in nlist:
        if i2 == "0":
          pass2 = 0
      if not(pass2 == 0):    
        for each in range(len(str(number))):
          if int(nlist[each]) == 0:
            pass1 += 1
          elif number % int(nlist[each]) == 0:
            pass1 += 1  
        if pass1 == len(str(number)):        
          nnl.append(number)
    print(nnl)    
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 19:33:49 | 显示全部楼层

这个,抱歉,发现有bug
def day354(left, right):
  if not(left < 1):
    numberlist = []
    nnl = []
    numberlist.append(1) 
    for i in range(left ,right):
      numberlist.append(i + 1) 
    for i in range(len(numberlist)):
      pass2 = 1
      number = numberlist[i]
      nlist = list(str(number))
      pass1 = 0
      for i2 in nlist:
        if i2 == "0":
          pass2 = 0
      if not(pass2 == 0):    
        for each in range(len(str(number))):
          if int(nlist[each]) == 0:
            pass1 += 1
          elif number % int(nlist[each]) == 0:
            pass1 += 1  
        if pass1 == len(str(number)):        
          nnl.append(number)
    print(nnl)    

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 20:21:43 | 显示全部楼层
TJBEST 发表于 2020-3-18 18:42
这个比暴力破解时间的40%左右 速度有点进步,但是代码超机长。累死我了

兄弟,你这个码好像不是太快……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 20:21:43 | 显示全部楼层

我的意思是大数据可能会超时,版主出题要不就是比较难,要不就是简单但要求大数据通过且高效率
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 20:23:55 | 显示全部楼层
fan1993423 发表于 2020-3-18 20:21
我的意思是大数据可能会超时,版主出题要不就是比较难,要不就是简单但要求大数据通过且高效率

其实力扣的测试都比较简单的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 20:27:11 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-3-18 20:23
其实力扣的测试都比较简单的

放心好了,版主一定会哪个大数据来测的,先来小数据看对不对,然后用大数据测时间
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 20:31:18 | 显示全部楼层
fan1993423 发表于 2020-3-18 20:27
放心好了,版主一定会哪个大数据来测的,先来小数据看对不对,然后用大数据测时间

也许你是对的吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 20:45:08 | 显示全部楼层
本帖最后由 TJBEST 于 2020-3-18 20:46 编辑
永恒的蓝色梦想 发表于 2020-3-18 20:21
兄弟,你这个码好像不是太快……


我主要练习自己的逻辑性,练习编码。公司项目,一般也不会让你编这个。重在练习。用的时候,直接百度就行,而且用python考虑速度有点本末倒置。c++和c岂不美哉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 20:51:08 | 显示全部楼层
TJBEST 发表于 2020-3-18 20:45
我主要练习自己的逻辑性,练习编码。公司项目,一般也不会让你编这个。重在练习。用的时候,直接百度就 ...

你们公司主要是做哪些项目。对,将效率的确python有先天劣势
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 20:52:22 | 显示全部楼层
TJBEST 发表于 2020-3-18 20:45
我主要练习自己的逻辑性,练习编码。公司项目,一般也不会让你编这个。重在练习。用的时候,直接百度就 ...

好吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 20:53:09 | 显示全部楼层
fan1993423 发表于 2020-3-18 20:51
你们公司主要是做哪些项目。对,将效率的确python有先天劣势

我们都是外包,我们只管审查,调试。主要是JAVA。水的一比
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 21:10:15 | 显示全部楼层
fan1993423 发表于 2020-3-18 20:21
我的意思是大数据可能会超时,版主出题要不就是比较难,要不就是简单但要求大数据通过且高效率

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-16 07:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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