鱼C论坛

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

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

[复制链接]
 楼主| 发表于 2020-3-12 16:57:10 | 显示全部楼层
阴阳神万物主 发表于 2020-3-12 13:50
难度评级:简单
要素分析:模拟,循环
感受:总感觉可以有公式直接算出剩下的数字,但是我没有探索出来。 ...

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

使用道具 举报

发表于 2020-3-12 17:01:06 | 显示全部楼层
楼主来测一下我的,我没用公式哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-12 17:01:46 | 显示全部楼层
mdphd 发表于 2020-3-12 15:17
这样应该可以了

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

使用道具 举报

发表于 2020-3-12 17:26:03 | 显示全部楼层
fan1993423 发表于 2020-3-12 16:55
看来12楼的公式是对的了,我没找到公式,刚才测了一下,大数据能出来

嗯,我编程序时没看他的,确实这位厉害,比我早点。我想了半天
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 17:31:45 | 显示全部楼层
6楼和12楼厉害,我还在钻死胡同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 17:32:26 | 显示全部楼层
def fun350(n, m):
    a = 0
    for i in range(n + 1):
        a = (a + m) % n
    return a
总觉得楼主测试我的时间总是到了次日的次日

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-12 17:52:26 | 显示全部楼层

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

使用道具 举报

发表于 2020-3-12 18:02:17 | 显示全部楼层
fan1993423 发表于 2020-3-12 16:52
不知道对不对,先写一个

那么快就想出好办法,虽然没公式效率高,测试是正确的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 18:10:18 | 显示全部楼层
TJBEST 发表于 2020-3-12 17:26
嗯,我编程序时没看他的,确实这位厉害,比我早点。我想了半天

说一下 公式原理,不太懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 18:18:50 | 显示全部楼层
TJBEST 发表于 2020-3-12 17:26
嗯,我编程序时没看他的,确实这位厉害,比我早点。我想了半天

太强了,就是公式看不懂。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 18:27:11 | 显示全部楼层
阴阳神万物主 发表于 2020-3-12 13:50
难度评级:简单
要素分析:模拟,循环
感受:总感觉可以有公式直接算出剩下的数字,但是我没有探索出来。 ...

大佬能解释下为什么m要先减1呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 18:28:43 | 显示全部楼层
本帖最后由 ouyunfu 于 2020-3-12 18:51 编辑
def f350(n:int,m:int)->int:
    i,k,s=0,0,[]
    while len(s)+1<n:
        if i==n:
            i=0
        if i in s:
            k-=1
        if k==m-1:
            s.append(i)
            k=-1
        i+=1
        k+=1
    return [i for i in range(n) if i not in s][0]

print(f350(5,3))
print(f350(10,17))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 18:37:00 | 显示全部楼层
fan1993423 发表于 2020-3-12 18:10
说一下 公式原理,不太懂

三言两语说不清楚啊,我用是告诉你 你自己揣摩一下
假设f(n,m)表示n个数 (下标0,1,2,3,....n-1)时,最后剩下的数
则有 递归式
f(n,m)=(f(n-1,m)+m)%m
其实也不难 就是 每次踢掉一个元素后 它下一个元素 变成新的0号位

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-12 19:11:21 | 显示全部楼层
def q350(m,n):
    list1 = list(range(n))
    list2 = []
    numN = n - 1
    numM = m
    while numN:        
        long = len(list1)    
        indexn = numM%long-1
        value = list1[indexn]    
        list1.remove(value)
        if (len(list1) == 3) and (indexn ==2):
            list1 = list1
        else:
            list2 = list1[(indexn):]+ list1[:(indexn)]        
            list1 = list2
        
        numN -= 1

    return(list1[0])

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-12 19:44:32 | 显示全部楼层
TJBEST 发表于 2020-3-12 18:37
三言两语说不清楚啊,我用是告诉你 你自己揣摩一下
假设f(n,m)表示n个数 (下标0,1,2,3,....n-1)时,最 ...

对,我最先也是这样想的,甚至也想到了用递归来做这道题,但是想到递归速度可能会慢,我后面那个思路也是这种新0号位思想,只不过没用递归。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-3-12 20:10:12 | 显示全部楼层
本帖最后由 Grrr 于 2020-3-13 12:25 编辑

刚学习的新手 能帮忙看看我这个是啦出错了么?
  File test350.py", line 16, in <module>
    test350(3,5)
  File "test350.py", line 4, in test350
    while len(list1)>1:
TypeError: object of type 'NoneType' has no len()

更新修改
def test350(m,n):
    list1 =list(range(n))
        
    while len(list1)>1:
        if len(list1)>=m:
            list1=list1[m:]+list1[:(m-1)]

        else:
            k=m%len(list1)
            list1=list1[k:]+list1[:(k-1)]
            

    print(list1)

    
test350(3,5)
test350(17,10)

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-12 20:51:24 | 显示全部楼层
本帖最后由 l0stparadise 于 2020-3-12 22:22 编辑
def f350(n,m):
    list1=[i for i in range(n)]
    while True:
        if m%len(list1):
            new_list=list1[m%len(list1):]
            new_list.extend(list1[0:m%len(list1)-1])
            list1.pop(m % len(list1) - 1)
            list1=new_list
        else:
            list1.pop(m % len(list1) - 1)
        if len(list1) == 1:
            return list1[0]

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-12 21:02:05 | 显示全部楼层
Grrr 发表于 2020-3-12 20:10
刚学习的新手 能帮忙看看我这个是啦出错了么?
  File test350.py", line 16, in
    test350(3,5)
list12.extend(list11)
            list1=list12
可是试试这样写,执行list12.extend(list11)后返回值是None,直接赋值给list1就是list1=None,或者直接写list1=list12+list11,效果一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 22:03:48 | 显示全部楼层
n=int(input("请输入组成圆环的数字数量并回车:"))
m=int(input("请输入删除数字的间距并回车:"))
a=[]
for i in range(0,n):
    a.append(i)
print("数字组成的初始圆环是%s"%(a))
while len(a)>1:
    k=m%len(a)
    if k==0:
        b=a[:(len(a)-1)]
        c=a[len(a):]
        a=c+b
        print("依次删除数字后圆环是%s"%(a))
    else:
        b=a[:(k-1)]
        c=a[k:]  
        a=c+b
        print("依次删除数字后圆环是%s"%(a))
print("最后剩余的数字是%s"%(a))

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-12 22:03:50 From FishC Mobile | 显示全部楼层
python.zzl 发表于 2020-3-12 21:02
可是试试这样写,执行list12.extend(list11)后返回值是None,直接赋值给list1就是list1=None,或者直接 ...

明白了 很清楚 谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-9 04:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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