原题内容
给一个正整数列nums,一个跳数jump,及幸存数量left。运算过程为:从索引为0的位置开始向后跳,中间跳过 J 个数字,命中索引为 J+1 的数字,该数被敲出,并从该点起跳,以此类推,直到幸存left个数为止。然后返回幸存数之和。
约束:
- 0是第一个起跳点。
- 起跳点和命中点之间间隔jump 个数字,已被敲出的数字不计入在内。
- 跳到末尾时无缝从头开始(循环查找),并可以多次循环。
- 若起始时 left > len(nums) 则无需跳数处理过程。
思路描述
题目本身不难,通过数组模拟整个跳出过程。需注意边界条件:每次跳过jump数后,删除的是下一节点,比如从0出发,跳过j个数,移除的是j+1;下次数数是从j+1处开始数,因为使用list的remove方法移除元素后,元素前移了(坐标减小),因此要人工减一才能保证后续步骤的正确。
代码示例
def C100_49(l, jump,left):start,sum = 0,0while len(l)!=left:start = (start+jump+1)%len(l)l.remove(l[start])start -=1for x in l:sum+=xreturn sum