英文:
Flipping a slice with a for loop logic error
问题
所以我正在尝试编写一个方法,它接受两个切片,翻转它们,并将它们互换。
例如:
s1 = {1,2,3,4,5}
s2 = {6,7,8,9,10}
应该返回:
s1 = {10,9,8,7,6}
s2 = {5,4,3,2,1}
以下是我的代码:
package main
import(
"fmt"
)
func main(){
f:= [5]int{1,2,3,4,5}
h:= [5]int{6,7,8,9,10}
var sliceF []int = f[0:5]
var sliceH []int = h[0:5]
fmt.Println(reverseReverse(sliceF,sliceH))
}
func reverseReverse(first []int, second []int) ([]int, []int){
//创建临时数组以保存交换前的遍历数组
var tempArr1 []int = first
var tempArr2 []int = second
//计数用于在循环中正确顺序地计数临时数组
var count int= 0
//遍历第一个数组,并将从末尾开始的值设置为临时数组的值
//临时数组从左到右递增
for i :=len(first)-1; i>=0;i--{
tempArr1[count] = first[i]
fmt.Println(i)
count++
}
count =0
//对第二个数组执行相同的操作
for i :=len(second)-1; i>=0;i--{
tempArr2[count] = second[i]
count++
}
//尝试将参数数组的值替换为临时数组的值
first=tempArr2
second = tempArr1
//返回数组
return first,second
}
运行后的输出如下:
4
3
2
1
0
[10 9 8 9 10]
[5 4 3 4 5]
*注意,我在for循环中包含了一个打印语句,以检查索引是否正确递减。
我知道有更好的方法来实现这个,但为了证明概念,我想使用for循环。
任何帮助都将不胜感激。我刚开始学习Go语言,往往会带有Java的习惯,所以我认为我的问题与此有关。
英文:
So I am trying to write a method that takes two slices, flips both of them and then gives them to each other.
Ex.
s1 = {1,2,3,4,5}
s2 = {6,7,8,9,10}
Should return:
s1 = {10,9,8,7,6}
s2 = {5,4,3,2,1}
Here is my code:
package main
import(
"fmt"
)
func main(){
f:= [5]int{1,2,3,4,5}
h:= [5]int{6,7,8,9,10}
var sliceF []int = f[0:5]
var sliceH []int = h[0:5]
fmt.Println(reverseReverse(sliceF,sliceH))
}
func reverseReverse(first []int, second []int) ([]int, []int){
//creating temp arrays to hold the traversed arrays before swapping.
var tempArr1 []int = first
var tempArr2 []int = second
//count is used for counting up the tempArrays in the correct order in the For loops
var count int= 0
//goes through the first array and sets the values starting from the end equal to the temp array
//which increases normally from left to right.
for i :=len(first)-1; i>=0;i--{
tempArr1[count] = first[i]
fmt.Println(i)
count++
}
count =0
//same as first for loop just on the second array
for i :=len(second)-1; i>=0;i--{
tempArr2[count] = second[i]
count++
}
//trying to replace the values of the param arrays to be equal to the temp arrays
first=tempArr2
second = tempArr1
//returning the arrays
return first,second
}
When run here is the output:
4
3
2
1
0
[10 9 8 9 10]
[5 4 3 4 5]
*Not I included a print statement in the for loop to check if the index is decreasing properly.
I understand there are better ways to do this but for proof of concept I want to use a for loop.
Any help appreciated. I am new to go and tend to have java habits so I assume somehow my problem is related to that.
答案1
得分: 2
这可以通过意识到实际上没有必要交换单个元素来简化。相反,反转每个数组并交换它们的顺序。这样更简单!
func reverseReverse(a, b []int) ([]int, []int) {
return reverse(b), reverse(a)
}
func reverse(a []int) []int {
end := len(a) - 1
// 为复制而分配一个相同长度的新数组切片。
ret := make([]int, len(a))
// 将a的每个元素反向复制到ret中。
for i := range a {
ret[end-i] = a[i]
}
return ret
}
有了这个启示,就没有太大必要使用非常专门的reverseReverse
函数了。自己交换顺序吧。
fmt.Println(reverse(sliceH), reverse(sliceF))
请注意,如果你只想获取数组的一个切片,只需写sliceH []int := h[:]
,而不需要指定起始和结束位置。起始位置默认为0,结束位置默认为数组的末尾。还要注意,不需要声明类型,:=
会为你处理。
更好的是,你可以直接声明和初始化它们。
sliceF := []int{1, 2, 3, 4, 5}
sliceH := []int{6, 7, 8, 9, 10}
英文:
This can be done much simpler by realizing there's no need to actually swap the individual elements. Instead, reverse each array and swap their order. Much simpler!
func reverseReverse( a, b []int ) ([]int, []int) {
return reverse(b), reverse(a)
}
func reverse( a []int ) []int {
end := len(a) - 1
// Allocate a new array slice of the same length to copy to.
ret := make( []int, len(a) )
// Copy each element of a into ret, reversed.
for i := range a {
ret[end-i] = a[i]
}
return ret
}
With that revelation, there's little need for the very specialized reverseReverse
function. Swap the order yourself.
fmt.Println(reverse(sliceH), reverse(sliceF))
Note that if you just want to take a slice of an array, it's sufficient to write sliceH []int := h[:]
without specifying the start and end. The start is assumed to be 0 and the end is the end. Also note there's no need to declare the type, :=
takes care of that for you.
Even better, you can declare and initialize them directly.
sliceF:= []int{1,2,3,4,5}
sliceH:= []int{6,7,8,9,10}
答案2
得分: 1
简短回答:
这行代码在逻辑上等同于:
详细回答:
x := [5]int{}
和 x := []int{}
实际上是两个非常不同的赋值方式。在第一种情况下,x
实际上是一个静态数组。而在第二种情况下,x
是一个切片,它实际上是一个具有长度、容量和指向底层数组的指针的数据结构。因此,var tempArr1 []int = first
的意思是将 first
的底层数组的指针复制到 tempArr1
中,所以对 first[i]
的任何修改都会反映在 tempArr1
中,反之亦然。
英文:
Short answer:
This line is logically identical to:
Detailed answer:
x := [5]int{}
and x := []int{}
are in fact two very different assignments. In the first case x
is actually a static array. In the second case x
is a slice which is in fact a data structure which has a length, capacity and a pointer to the underlying array. Therefore, var tempArr1 []int = first
means copy the pointer to the underlying array of first
into the tempArr1
, so any modification to first[i]
will be reflected in tempArr1
and vice versa
答案3
得分: 1
例如,
package main
import "fmt"
func reverse(s []int) []int {
for i := 0; i < len(s)/2; i++ {
s[i], s[len(s)-1-i] = s[len(s)-1-i], s[i]
}
return s
}
func main() {
s1, s2 := []int{1, 2, 3, 4, 5}, []int{6, 7, 8, 9, 10}
fmt.Println(s1, s2)
s1, s2 = reverse(s2), reverse(s1)
fmt.Println(s1, s2)
}
输出:
[1 2 3 4 5] [6 7 8 9 10]
[10 9 8 7 6] [5 4 3 2 1]
英文:
For example,
package main
import "fmt"
func reverse(s []int) []int {
for i := 0; i < len(s)/2; i++ {
s[i], s[len(s)-1-i] = s[len(s)-1-i], s[i]
}
return s
}
func main() {
s1, s2 := []int{1, 2, 3, 4, 5}, []int{6, 7, 8, 9, 10}
fmt.Println(s1, s2)
s1, s2 = reverse(s2), reverse(s1)
fmt.Println(s1, s2)
}
Output:
[1 2 3 4 5] [6 7 8 9 10]
[10 9 8 7 6] [5 4 3 2 1]
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论