我正在尝试通过编辑列表来解决问题,该列表跟踪学校中已打开和关闭的储物柜,我得到的代码如下:
y = list()
lockers = 100
students = 100
s = 2
i = 0
while i < lockers:
y.append("O")
i = i + 1
w = len(y)
while s <= students:
for x in range(s, w, s):
if y[x] == "O":
y[x] = "C"
if y[x] == "C":
y[x] = "O"
s = s + 1
openLockers = y.count("O")
print(openLockers)
代码运行流畅,没有任何错误,但是返回的值为100。我已经对每个变量进行了故障排除,并且都对其进行了修改。我的结论是,问题出在线
y[x] = "C"
和
y[x] = "C"
在这些行之后,列表完全没有改变。
我添加了w以便不使用range函数中的len(y)
并且不能使用
for i in y
因为我需要在循环y
中的各个项目之间迈出一步。
我希望能够在循环内修改列表中的项目或使用解决方法...
答案 0 :(得分:5)
您的代码还有其他一些地方可以简化,但是您真正的问题在for
循环内:
if y[x] == "O":
y[x] = "C"
if y[x] == "C":
y[x] = "O"
如果储物柜是打开的,则将其设置为关闭。然后,立即执行下一个if
语句,将其设置回打开状态。因此,您似乎没有更改y
。将第二个if
语句更改为elif
语句:
if y[x] == "O":
y[x] = "C"
elif y[x] == "C":
y[x] = "O"
这应该可以解决您的问题。
现在,这是独立且不必要的,但会大大简化您的代码。试试这个(使用布尔状态而不是字母):
lockers = 100
students = 100
y = [False] * lockers
for s in range(2, students):
for x in range(s, lockers, s):
y[x] = not y[x]
openLockers = y.count(False)
print(openLockers)
答案 1 :(得分:1)
假设std::shared_ptr
只有两个可能的值,分别是y[x]
和'O'
,则可以在代码中使用以下简化形式:
'X'