zltzlt 发表于 2020-4-18 19:11:37

Python:每日一题 379

本帖最后由 zltzlt 于 2020-4-18 19:14 编辑

今天的题目:

假设有一个从 1 到 n 的有序整数数组。

首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾。

第二步,在剩下的数字中,从右到左,从倒数第一个数字开始,每隔一个数字进行删除,直到列表开头。

不断重复这两步,直到数组只剩下一个数字。

返回数组中剩下的最后一个数字。

示例:

输入:n = 9
输出:6
解释:删除的数字用粗体标示:
1 2 3 4 5 6 7 8 9
2 4 6 8
2 6
6
所以最后剩下的是 6 。

{:10_298:}欢迎大家一起答题!{:10_298:}

永恒的蓝色梦想 发表于 2020-4-18 19:13:10

本帖最后由 永恒的蓝色梦想 于 2020-4-18 19:49 编辑

Python 牛逼!class Solution:
    def lastRemaining(self, n: int) -> int:
      n=range(1,n+1)
      flag=True

      while (length:=n.__len__())!=1:
            n=n
            flag=not flag

      return n

永恒的蓝色梦想 发表于 2020-4-18 19:14:28

示例错了,第二行,被删除的是 4 和 8

zltzlt 发表于 2020-4-18 19:15:14

永恒的蓝色梦想 发表于 2020-4-18 19:14
示例错了,第二行,被删除的是 4 和 8

感谢提醒,已经纠正!

kinkon 发表于 2020-4-18 19:28:54

占楼

March2615 发表于 2020-4-18 19:47:09

本帖最后由 March2615 于 2020-4-18 20:03 编辑

# 解题思路:
# 首先 func(2k+1) == func(2k),故只考虑func(2k)
# 找规律:f(2k) = 2 * (k + 1 - f(k))
# 推导过程就是写出来找一下就好,还挺好找的


def daily379(n: int) -> int:
    return 1 if n == 1 else 2 * (n // 2 + 1 - daily379(n // 2))


{:10_256:}

斐波纳税 发表于 2020-4-18 19:49:36

def fun379(n):
    lst = list(range(1, n+1))
    f = 1
    while len(lst) - 1:
      if f:
            lst = lst
            lst.reverse()
            f = 0
      else:
            lst = lst
            lst.reverse()
            f = 1
    return lst

fan1993423 发表于 2020-4-18 21:03:07

March2615 发表于 2020-4-18 19:47


小心超过递归深度{:10_256:}

塔利班 发表于 2020-4-18 21:04:20

本帖最后由 塔利班 于 2020-4-18 22:55 编辑

def f379(n):
    res,l=1,[]
    while n>=2:
      n//=2
      l.append(n)
    for e in l[::-1]:
      res=2*(e+1-res)
    return res

fan1993423 发表于 2020-4-18 21:12:18

塔利班 发表于 2020-4-18 21:04


输入12,输出5,这题答案永远不会输出奇数,因为第一步就会干掉所有奇数

塔利班 发表于 2020-4-18 21:37:14

fan1993423 发表于 2020-4-18 21:12
输入12,输出5,这题答案永远不会输出奇数,因为第一步就会干掉所有奇数

是吗,不是倒数开始删么,,也许我文字学的不好

fan1993423 发表于 2020-4-18 21:46:45

塔利班 发表于 2020-4-18 21:37
是吗,不是倒数开始删么,,也许我文字学的不好

它第一步是从左往右开始删,而且是从1开始删

ouyunfu 发表于 2020-4-18 22:08:11

def f379(n):
    ls=list(range(1,n+1))
    while len(ls) != 1:
      if len(ls)%2==0:
            ls=ls[::-2]
      else:
            ls=ls[::-2]
    return ls

塔利班 发表于 2020-4-18 22:55:15

fan1993423 发表于 2020-4-18 21:46
它第一步是从左往右开始删,而且是从1开始删

恩,开始没看到删除顺序,

旅途Z 发表于 2020-4-19 01:26:40

本帖最后由 旅途Z 于 2020-4-19 19:04 编辑

啊,没仔细看题,改成输入整数了,但是好像会超时。。
def delete_odd(num):
    def in_func(array):
      length = len(array)
      if length == 1:
            return array
      index =
      array = for i in range(length) if i not in index]
      array.reverse()
      return in_func(array)
    num_array =
    return in_func(num_array)

Python3005 发表于 2020-4-19 03:32:59

本帖最后由 Python3005 于 2020-4-19 04:04 编辑

def fun(n):
      num = range(1, n+1)
      while len(num) > 1:
                num = list(filter(lambda x: num.index(x) % 2, num))
                num.reverse()
      return num

kkk999de 发表于 2020-4-19 09:21:46

def f379(n):
    n = list(range(2,n+1,2))
    while len(n) > 1:      
      n.reverse()
      b = (len(n)+1)//2
      for i in range(b):
            n.pop(i)
    return n

听风夜雨 发表于 2020-4-19 10:17:02

def f(n):
    x=list(range(1,n+1))
    while len(x)!=1:
      x=x
      if len(x)!=1:
            x.pop()
            x=x[::-2]
      x.sort()
    return list(x)

风魔孤行者 发表于 2020-4-19 13:59:00

def f(n):
    list1 = list(range(1,n+1))
    def f1(list1):
      if len(list1) == 1:
            return list1
      else:
            list2 = []
            for n in range(1,len(list1),2):
                list2.append(list1)
            list2.reverse()
            return f1(list2)
    return f1(list1)

xiangjianshinan 发表于 2020-4-19 15:46:06

终于能做出一个题目啦,好开心!!!
先上代码,再来学习其他前辈的。
自己做过后,再看别人的,并融会贯通,感觉非常好。
l = list(range(1,int(input('请输入一个整数:'))+1))
ta = 1
print(l)
while len(l)>1:
    temp = 1
    templ = l.copy()
    for i in templ:
      if temp % 2 == ta:
            l.remove(i)
      temp +=1
    if ta==1:
      ta=0
    else:
      ta=1
    print(l)

页: [1] 2 3
查看完整版本: Python:每日一题 379