您好,我正在执行简单的FizzBuzz挑战。我想出了解决这个问题的办法。但是我不明白为什么我的第一次尝试超出了范围,或者幕后发生了什么。
为防止其超出我更改的范围
array.remove(at:i)
到
array.remove(at:i-1)
var array = [String]()
for i in 1...100{
array.append("\(i)")
if i % 3 == 0 && i % 5 == 0 {
array.remove(at: i)
array.append("FizzBuzz")
}else if i % 3 == 0{
array.remove(at: i)
array.append("Fizz")
} else if i % 5 == 0{
array.remove(at: i)
array.append("Buzz")
}
}
print(array)
var array = [String]()
for i in 1...100{
array.append("\(i)")
if i % 3 == 0 && i % 5 == 0 {
array.remove(at: i - 1 )
array.append("FizzBuzz")
}else if i % 3 == 0{
array.remove(at: i - 1)
array.append("Fizz")
} else if i % 5 == 0{
array.remove(at: i - 1)
array.append("Buzz")
}
}
print(array)
答案 0 :(得分:0)
你在说
for i in 1...100{
但是数组索引从0开始。因此,在每个循环中,您刚刚添加的项目都具有索引i-1
。尚无索引为i
的项目。
换句话说,请考虑代码的这一部分:
if i % 3 == 0 && i % 5 == 0 {
array.remove(at: i)
在这里您对i
的含义不屑一顾。在第一行中,它是数字 i
。但是在第二行中,索引i
是 at 。而且由于您以1开头,所以这两个数字相隔1。例如,第一次通过循环i
是 1,但是值1是 at < / em>索引0。
答案 1 :(得分:0)
remove(at :)函数可删除指定位置的元素。例如,如果我有一个像[1,2,3,4]的数组,并且我调用array.remove(at:2),则结果数组将是[1,2,4]。
重要是要了解该函数会删除指定INDEX位置的元素。 不是值本身。 Swift数组的索引为零,第一个元素位于位置0。
现在,有了这方面的知识,我建议您继续使用一些打印语句调试第一个代码,这样您就可以快速了解为什么代码超出范围。希望通过本实验,您可以了解一些基本概念。
祝你好运!
答案 2 :(得分:0)
因为数组的索引为零,并且您在for循环中从1开始,所以当您到达3并尝试检索第三个元素(表明它们是数组中的四个元素)时,swift将抛出错误。简单的解决方案是从0开始
for i in 0...100{
print(i)
array.append("\(i)")
if i % 3 == 0 && i % 5 == 0 {
array.remove(at: i)
array.append("FizzBuzz")
}else if i % 3 == 0{
array.remove(at: i)
array.append("Fizz")
} else if i % 5 == 0{
array.remove(at: i)
array.append("Buzz")
}
}
print(array)
}