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: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 示例错了,第二行,被删除的是 4 和 8 永恒的蓝色梦想 发表于 2020-4-18 19:14
示例错了,第二行,被删除的是 4 和 8
感谢提醒,已经纠正! 占楼 本帖最后由 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:} 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 March2615 发表于 2020-4-18 19:47
小心超过递归深度{:10_256:} 本帖最后由 塔利班 于 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 塔利班 发表于 2020-4-18 21:04
输入12,输出5,这题答案永远不会输出奇数,因为第一步就会干掉所有奇数 fan1993423 发表于 2020-4-18 21:12
输入12,输出5,这题答案永远不会输出奇数,因为第一步就会干掉所有奇数
是吗,不是倒数开始删么,,也许我文字学的不好 塔利班 发表于 2020-4-18 21:37
是吗,不是倒数开始删么,,也许我文字学的不好
它第一步是从左往右开始删,而且是从1开始删 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 fan1993423 发表于 2020-4-18 21:46
它第一步是从左往右开始删,而且是从1开始删
恩,开始没看到删除顺序, 本帖最后由 旅途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 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 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 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) 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) 终于能做出一个题目啦,好开心!!!
先上代码,再来学习其他前辈的。
自己做过后,再看别人的,并融会贯通,感觉非常好。
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)