剑指offer 圆圈中最后剩下的数字 python实现

每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def LastRemaining_Solution(self, n, m):
        if n==0 or m==0:
            return -1
        pHead = self.build_circle(n)
        step = 0
        while pHead:
            step += 1
            if step == m:
                
                if pHead.next != pHead:
                    pHead.val = pHead.next.val
                    pHead.next = pHead.next.next
                else:
                    print(pHead.val)
                    return
                step = 0
            else:
                pHead = pHead.next
        return
            
    def build_circle(self, n):
        tmp = None
        pHead = None
        pRear = None
        for i in range(n):
            if tmp == None:
                tmp = ListNode(i)
                pHead = tmp
            else:
                tmp.next = ListNode(i)
                tmp = tmp.next
        tmp.next = pHead
        return pHead


if __name__ == "__main__":
    double_num = input()
    n = int(double_num[0])
    m = int(double_num[1])
    so = Solution()
    so.LastRemaining_Solution(n, m)



### 剑指Offer书籍主要内容 《剑指Offer》是一本专注于编程面试的经典书籍,涵盖了大量经典的算法和据结构问题[^3]。书中通过一系列精心设计的题目,帮助读者深入理解和掌握各种常见算法及其应用场景。 #### 据结构与基础算法 该书的基础部分主要围绕经典的据结构展开讨论,包括但不限于链表、栈、队列以及二叉树等内容。例如,在处理链表时,《剑指Offer》提供了诸如“从尾到头打印单向链表”的解决方案[^4];而在探讨二叉树方面,则有“顺时针打印矩阵”、“二叉树的镜像”等问题的具体分析方法[^2]。 #### 高级主题与复杂度优化 随着内容推进,本书逐渐引入更复杂的概念和技术手段来解决问题。比如,“最小的K个”这一章节介绍了如何利用堆或者快速选择算法高效获取集合中小于指定量的部分元素;还有关于动态规划的应用实例——“整中1出现的次”,它教会我们怎样通过状态转移方程减少不必要的计算量从而提升效率。 #### 实际应用案例研究 为了增强实战能力,《剑指Offer》还特别挑选了一些具有代表性的实际工程场景下的挑战作为练习素材。其中包括“扑克牌顺子”这样趣味性强又考察思维灵活性的小游戏型试题[^2],也有类似于“孩子们的游戏(圆圈最后剩下)”这种需要巧妙运用学原理才能完美解答的大规模模拟类难题[^4]。 --- ### 解题思路举例说明 以下是几个典型例子及其对应的解题策略: #### 示例一:二进制中1的个 对于给定的一个整,统计其二进制形式下有多少位为`1`。可以通过不断右移操作配合掩码检测每一位是否等于`1`完成计过程。 ```python def count_ones(n): count = 0 while n != 0: count += (n & 1) n >>= 1 return count ``` #### 示例二:值的整次方 实现一个函用于计算某个底base以指exponent相乘的结果。需要注意当指小于零的情况特殊对待,并且考虑浮点误差带来的影响。 ```python def power(base, exponent): if base == 0 and exponent < 0: raise ValueError("Invalid input") abs_exponent = -exponent if exponent < 0 else exponent result = 1 for _ in range(abs_exponent): result *= base return 1 / result if exponent < 0 else result ``` #### 示例三:丑 定义所谓的‘丑’是指仅含质因子2、3或5的正整序列中的某一项位置上的值是多少?采用动态规划的思想预先存储已知较小范围内的所有符合条件候选者再逐步扩展直至满足目标长度为止。 ```python def get_ugly_number(index): if index <= 0: return 0 ugly_numbers = [1] i2,i3,i5=0,0,0 next_multiple_of_2,next_multiple_of_3,next_multiple_of_5=2,3,5 while len(ugly_numbers)<index: min_val=min(next_multiple_of_2,next_multiple_of_3,next_multiple_of_5) ugly_numbers.append(min_val) if min_val==next_multiple_of_2:i2+=1;next_multiple_of_2=ugly_numbers[i2]*2; if min_val==next_multiple_of_3:i3+=1;next_multiple_of_3=ugly_numbers[i3]*3; if min_val==next_multiple_of_5:i5+=1;next_multiple_of_5=ugly_numbers[i5]*5; return ugly_numbers[-1] ``` --- ### 总结 通过对以上几大板块的学习与实践训练,可以有效提高个人解决各类计算机科学领域内核心理论及技术难点的能力水平。同时也能培养良好的编码习惯与严谨细致的工作态度,这对于准备求职尤其是针对互联网行业相关岗位而言至关重要[^1]^。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值