如何为数组的最后一个元素添加特殊条件
How to add a special condition for the last element of an array
根据任务描述,输出应该是一个新数组,数组days的所有元素都大于它们的前一个和下一个元素(以1为增量)。例如,我们有作为输入
[ ]int{3, 2, 4, 3, 7, 9}
输出应该是:
[ ]int{3, 4, 9}
起初我试着写下一个条件:
if days[i] > days[i-1] && days[i] > days[i+1] {
arr = append(arr, days[i])
}
但出现错误:index out of range [-1]
然后我改变了条件,为最后一个元素添加了一个特殊条件:
package main
import (
"fmt"
)
func chaos(days []int) []int {
var arr []int
for i := 0; i < len(days)-1; i++ {
if days[i] > days[i+1] {
arr = append(arr, days[i])
}
if days[len(days)-1] > days[len(days)-2] {
arr = append(arr, days[len(days)-1])
}
}
return arr
}
func main() {
fmt.Println(chaos([]int{3, 2, 4, 3, 7, 9}))
}
但是输出是[3 9 9 4 9 9 9]
如何正确指定最后一个元素的条件以及为什么我的结果不正确?
您可以将 math.MinInt64
(可以视为负无穷大)添加到切片的开始和结束,以轻松处理两种边缘情况。然后从索引 1
开始迭代到索引 n-2
(通过排除我们添加的条目 0
和 n-1
)。
我会像下面这样尝试。
package main
import (
"fmt"
"math"
)
func chaos(days []int) []int {
var arr []int
// Add negative infinity to the start
days = append([]int{math.MinInt64}, days...)
// Add negative infinity to the end
days = append(days, math.MinInt64)
for i := 1; i <= len(days)-2; i++ {
if (days[i] > days[i+1]) && (days[i] > days[i-1]) {
arr = append(arr, days[i])
}
}
return arr
}
func main() {
fmt.Println(chaos([]int{3, 2, 4, 3, 7, 9}))
}
9
被多次填充的原因是因为您在 for
循环中使用了低于 if
的条件。将此 if
放在 for
循环之外,然后您将获得所需的输出:
if days[len(days)-1] > days[len(days)-2] {
arr = append(arr, days[len(days)-1])
}
但是,除此之外,您还只是将 i'th
元素与下一个元素进行比较。根据问题,您还应该将它与之前的元素进行比较。以下是可以在您的代码中进行的可能的更改以使其正常工作:
package main
import (
"fmt"
)
func chaos(days []int) []int {
var arr []int
fmt.Println(len(days))
if days[0] > days[1] {
arr = append(arr, days[0])
}
for i := 1; i < len(days)-1; i++ {
if (days[i] > days[i+1]) && (days[i] > days[i-1]) {
arr = append(arr, days[i])
}
}
if days[len(days)-1] > days[len(days)-2] {
arr = append(arr, days[len(days)-1])
}
return arr
}
func main() {
fmt.Println(chaos([]int{3, 2, 4, 3, 7, 9}))
}
根据任务描述,输出应该是一个新数组,数组days的所有元素都大于它们的前一个和下一个元素(以1为增量)。例如,我们有作为输入
[ ]int{3, 2, 4, 3, 7, 9}
输出应该是:
[ ]int{3, 4, 9}
起初我试着写下一个条件:
if days[i] > days[i-1] && days[i] > days[i+1] {
arr = append(arr, days[i])
}
但出现错误:index out of range [-1]
然后我改变了条件,为最后一个元素添加了一个特殊条件:
package main
import (
"fmt"
)
func chaos(days []int) []int {
var arr []int
for i := 0; i < len(days)-1; i++ {
if days[i] > days[i+1] {
arr = append(arr, days[i])
}
if days[len(days)-1] > days[len(days)-2] {
arr = append(arr, days[len(days)-1])
}
}
return arr
}
func main() {
fmt.Println(chaos([]int{3, 2, 4, 3, 7, 9}))
}
但是输出是[3 9 9 4 9 9 9]
如何正确指定最后一个元素的条件以及为什么我的结果不正确?
您可以将 math.MinInt64
(可以视为负无穷大)添加到切片的开始和结束,以轻松处理两种边缘情况。然后从索引 1
开始迭代到索引 n-2
(通过排除我们添加的条目 0
和 n-1
)。
我会像下面这样尝试。
package main
import (
"fmt"
"math"
)
func chaos(days []int) []int {
var arr []int
// Add negative infinity to the start
days = append([]int{math.MinInt64}, days...)
// Add negative infinity to the end
days = append(days, math.MinInt64)
for i := 1; i <= len(days)-2; i++ {
if (days[i] > days[i+1]) && (days[i] > days[i-1]) {
arr = append(arr, days[i])
}
}
return arr
}
func main() {
fmt.Println(chaos([]int{3, 2, 4, 3, 7, 9}))
}
9
被多次填充的原因是因为您在 for
循环中使用了低于 if
的条件。将此 if
放在 for
循环之外,然后您将获得所需的输出:
if days[len(days)-1] > days[len(days)-2] {
arr = append(arr, days[len(days)-1])
}
但是,除此之外,您还只是将 i'th
元素与下一个元素进行比较。根据问题,您还应该将它与之前的元素进行比较。以下是可以在您的代码中进行的可能的更改以使其正常工作:
package main
import (
"fmt"
)
func chaos(days []int) []int {
var arr []int
fmt.Println(len(days))
if days[0] > days[1] {
arr = append(arr, days[0])
}
for i := 1; i < len(days)-1; i++ {
if (days[i] > days[i+1]) && (days[i] > days[i-1]) {
arr = append(arr, days[i])
}
}
if days[len(days)-1] > days[len(days)-2] {
arr = append(arr, days[len(days)-1])
}
return arr
}
func main() {
fmt.Println(chaos([]int{3, 2, 4, 3, 7, 9}))
}