zoukankan      html  css  js  c++  java
  • 面试题-python3 100个人围一圈编号1-100,依次开始报数报到3的退出

    python测开笔试题

    100个人围一圈编号1-100,依次开始报数,
    从1开始,报到3的退出,然后继续从1开始,报到3退出,直到最后只有2个人,得到编号 58, 91
    从1开始,报到4的退出,然后继续从1开始,报到4退出,直到最后只有3个人,得到编号 34, 45, 97

    实现效果:
    输入:3
    输出: 58,91
    输入:4
    输出: 34, 45, 97

    python3代码

    解决思路,先把1-100编号,前面的99个单独取出来(能数到1-3),最后一个100,由于只有一个了,先单独拿出来
    下一步前99个,数到3的移除,得到一个新的列表编号
    把100和新的列表编号拼接到一块,这样可以进行下一轮的报数

    n = 3  # 报的数
    a = list(range(1, 101))  # 编号1-100
    # 取出最后的余数
    end_a = a[len(a)//n*n:]   # 多余的
    start_a = a[:len(a)//n*n]
    # print(start_a)
    # print(end_a)
    i = n
    while i <= len(start_a):
        # 每隔3移除掉
        start_a.remove(start_a[i-1])
        i = (i-1) + n
    # 多余的数拼接到前面,等下次继续
    new_a = end_a+start_a
    # 第一轮移除后得到新的列表
    print(new_a)
    # 得到新的列表:[100, 1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 
    19, 20, 22, 23, 25, 26, 28, 29, 31, 32, 34, 35, 37, 38, 40, 41, 
    43, 44, 46, 47, 49, 50, 52, 53, 55, 56, 58, 59, 61, 62, 64, 65, 
    67, 68, 70, 71, 73, 74, 76, 77, 79, 80, 82, 83, 85, 86, 
    88, 89, 91, 92, 94, 95, 97, 98]
    

    得到新的列表后,继续重复上面的操作,于是可以写个递归函数,直到列表数小于3为止

    # 作者-上海悠悠 QQ交流群:717225969
    # blog地址 https://www.cnblogs.com/yoyoketang/
    
    def remove_n(a, n=3):
        if len(a) < n:
            return sorted(a)
        # a = list(range(1, 101))
        # 取出最后的余数
        end_a = a[len(a)//n*n:]
        start_a = a[:len(a)//n*n]
        # print(start_a)
        # print(end_a)
        i = n
        while i <= len(start_a):
            start_a.remove(start_a[i-1])
            i = (i-1) + n
        new_a = end_a+start_a
        # print(new_a)
        return remove_n(new_a, n)
    
    if __name__ == '__main__':
        a = list(range(1, 101))
        n1 = input()
        result1 = remove_n(a, int(n1))
        print(result1)
        n2 = input()
        result2 = remove_n(a, int(n2))
        print(result2)
    

    实现效果:

    3
    [58, 91]
    4
    [34, 45, 97]
    

    精简方法

    群里小伙伴提供的方法,此法甚妙!

    a = list(range(1, 101))
    n = 3
    while len(a) >= n:
        if n-2 >= 0:
            a = a[n:] + a[:n-1]
    print(sorted(a))
    

    运行结果:[58, 91]

    a = list(range(1, 101))
    n = 4
    while len(a) >= n:
        if n-2 >= 0:
            a = a[n:] + a[:n-1]
    print(sorted(a))
    

    运行结果:[34, 45, 97]
    作者-上海悠悠 blog地址 https://www.cnblogs.com/yoyoketang/

  • 相关阅读:
    BZOJ3073 Journeys
    UOJ261 【NOIP2016】天天爱跑步 LCA+动态开点线段树
    [bzoj2654] tree 最小生成树kruskal+二分
    【ZJOI2007】【BZOJ1059】矩阵游戏 匈牙利算法
    [Bzoj 2427] [HAOI2010] 软件安装 tarjan缩点+树形DP
    [CQOI2011]放棋子--DP
    BZOJ 3990 排序
    (六)接入层:反向代理,接入层扩容,负载均衡
    (五)伪分布式:你以为,多机就是分布式?
    (四)容量设计:流量高低,对架构究竟有什么影响?
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/14766469.html
Copyright © 2011-2022 走看看