4

我将如何遍历 1-100 的列表,从第一个元素开始删除所有其他元素,然后重复该步骤,直到列表中只剩下一个元素。我必须使用循环链表,还是只使用循环和条件语句来完成?

4

7 回答 7

4

这会一遍又一遍地删除所有其他元素,直到只剩下一个

>>> L = range(100)       # for Python3, use L = list(range(100))
>>> while len(L) > 1:
...     del L[::2]
... 
>>> L
[63]

我不确定“循环列表”是什么意思,但也许需要这个修改

>>> L = range(100)
>>> while len(L) > 1:
...     del L[len(L)%2::2]
... 
>>> L
[99]

L的长度是否为奇数的len(L)%2方法del L[1::2]

或者,如果您想看看发生了什么:

>>> L = range(100)
>>> while len(L) > 1:
...     del L[len(L)%2::2]
...     L
... 
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
[3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63, 67, 71, 75, 79, 83, 87, 91, 95, 99]
[3, 11, 19, 27, 35, 43, 51, 59, 67, 75, 83, 91, 99]
[3, 19, 35, 51, 67, 83, 99]
[3, 35, 67, 99]
[35, 99]
[99]
于 2014-02-19T03:04:42.563 回答
3

如何使用 Python 方便的切片语法:

while len(best_list_ever) > 1:
    best_list_ever = best_list_ever[1::2]

该表达式best_list_ever[1::2]是原始列表中所有其他元素的列表。

编辑:我实际上对循环约束的事情很困惑,但如果 ysakamoto 准确地记录了它,那么也许可以看看 gnibbler 的答案。

于 2014-02-19T03:03:53.260 回答
2

这个答案只是不断附加您希望保留的项目

>>> from itertools import islice
>>> L = range(100)
>>> for i in islice(L, 1, None, 2):
...     L.append(i)
... 
>>> i
71

等效地不使用 islice

>>> L = range(100)
>>> i = 1
>>> while i < len(L):
...     L.append(L[i])
...     i += 2
... 
>>> L[-1]
71

使用双端队列的内存高效版本

>>> from collections import deque
>>> L = deque(range(100))
>>> while len(L) > 1:
...     _ = L.popleft()
...     L.append(L.popleft())
... 
>>> L
deque([71])

这些都给出了 71 的值,这与@ysakamoto 的回答不符

于 2014-02-19T04:42:58.370 回答
1

如果假设循环列表结构,当列表的最后一个元素被删除时,下一个要删除的元素不再是剩余列表中的第一个,而是第二个。因此,

L = range(100)
st1=len(L)%2
st2=0
while len(L)>1:
    del L[st2::2]
    st2=(st1+st2)%2
    st1=len(L)%2
    print L

应该是正确的。

结果是

[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 95, 97, 99]
[3, 7, 11, 15, 19, 23, 27, 31, 35, 39, 43, 47, 51, 55, 59, 63, 67, 71, 75, 79, 83, 87, 91, 95, 99]
[7, 15, 23, 31, 39, 47, 55, 63, 71, 79, 87, 95]
[7, 23, 39, 55, 71, 87]
[7, 39, 71]
[7, 71] 
[71]
于 2014-02-19T03:50:46.457 回答
0

你可以用两个嵌套的while循环来做到这一点

pseudo code

    // if there is more than one element, lets keep working 
    while(list.size > 1) {
      // Know there is one element, thus safe to assume 0
      int i = 0;

      // retrieve list size, going to be mutating list 
      int l = list.size

      // iterate through list  
      while(i < l) {
        // delete element, we want to delete the next element but skip previous, thus floor / 2
        list.delete(floor(i / 2));

        // skip every other element, thus increment by 2
        i = i + 2;
      }
    }

for 循环或任何迭代循环也可以做到这一点。如果您在执行此操作时打印元素,您应该会看到按顺序删除的元素(假设列表大小为 10)

循环 1 0,2,4,6,8

循环 2 1,5,9

循环 3 3

将原始列表中的元素 7 留给您

谢谢!

于 2014-02-19T03:00:40.973 回答
0

虽然不像其他答案那么紧凑,但这是我的版本。我是 Python 新手,通过查看其他人的答案学到了很多东西。

mylist = range(20)
print mylist
while len(mylist) > 1:
    for i in range(len(mylist) / 2):
        del mylist[i] 

    print  mylist

结果:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
[3, 7, 11, 15, 19]
[7, 15, 19]
[15, 19]
[19]
于 2014-02-19T03:27:39.233 回答
0

长代码:

num=int(input())
list_num=[]
for j in range(num):
    list_num.append(j+1)
k=0   
while len(list_num)>1:
    new_list_sum=[]
    l=0
    while k+2*l<len(list_num):
        new_list_sum.append(list_num[k+2*l])
        l=l+1
    if (k+2*l)%(len(list_num)-1)==1:
        k=0
    else:
        k=1
    list_num=new_list_sum[:]
    print(list_num)
print(list_num[0])

短代码:

num=int(input())
l=num-2**(len(bin(num)[2:])-1)
print (2*l+1)

参考:https ://en.wikipedia.org/wiki/Josephus_problem

于 2017-09-28T07:16:08.610 回答