프로그래밍 문제를 다루고 있습니다.
두 개의 정수 n과 k가 주어지면 1 ... n 중 k 개의 가능한 모든 조합을 반환합니다.
입력 n = 5, k = 4 인 경우 출력은 [[1,2,3,4], [1,2,3,5], [1,2,4,5], [1,3 , 4,5], [2,3,4,5]], 다음은 내 골랑 솔루션입니다
func combine(n int, k int) [][]int {
result := [][]int{}
comb := []int{}
subcom(0, k, n, &comb, &result)
return result
}
func subcom(s, k, n int, comb *[]int, result *[][]int) {
if k > 0 {
for i := s + 1; i <= n-k+1; i++ {
c := append(*comb, i)
subcom(i, k-1, n, &c, result)
}
} else {
*result = append(*result, *comb)
}
}
내 솔루션이 옳다고 생각하지만 [[1 2 3 5] [1 2 3 5] [1 2 4 5] [1 3 4 5] [2 3 4 5]]를 반환합니다.
디버깅 후 처음에는 결과 조각에 [1 2 3 4]가 추가되었지만 나중에 [1 2 3 5]로 변경되어 [1 2 3 5] 두 번 반복되는 결과를 얻었습니다. 그러나 나는 여기서 무엇이 잘못되었는지 알아낼 수 없습니다.
이는 .NET을 사용할 때 흔히 발생하는 실수 append
입니다.
코드가 실행되면 c:=append(*comb,i)
먼저 기본 배열의 할당 된 메모리를 사용하여 새 항목을 추가하고 실패한 경우에만 새 슬라이스를 만들려고합니다. 이것은 변경 무엇 [1 2 3 4]
에 [1 2 3 5]
- 그들은 동일한 기본 메모리를 공유하기 때문이다.
이 문제를 해결하려면 결과에 추가 할 때 복사하십시오.
now := make([]int,len(*comb))
copy(now,*comb)
*result = append(*result,now)
또는 복사 단축키를 사용하십시오.
*result = append(*result, append([]int{},*comb...))
최신 정보:
기본 메모리가 의미하는 바를 이해하려면 Go 슬라이스의 내부 모델을 이해해야합니다.
Go에서 슬라이스는 패키지를 SliceHeader
통해 액세스 reflect
할 수 unsafe.Sizeof
있으며 주소 를 사용 하고 가져올 때 참조 되는 데이터 구조 를 가지고 있습니다.
SliceHeader
: 세 가지 요소의 복용 염려 Len
, Cap
그리고 Ptr
. fisrt 두 trivail입니다 : 그들은 무엇 len()
과 cap()
입니다. 마지막 uintptr
것은 슬라이스에 포함 된 데이터의 메모리를 가리키는 a 입니다.
슬라이스를 얕게 복사하면 새 슬라이스 SliceHeader
가 생성되지만 Ptr
. 따라서 기본 메모리는 복사되지 않고 공유됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다