组合
This commit is contained in:
parent
0bb5d85c8d
commit
cb2de22b13
|
@ -334,3 +334,40 @@ func SliceChunk[T any](arr []T, size int) [][]T {
|
||||||
func NumberToString[T IntNumber | ~float64 | ~float32](n T) string {
|
func NumberToString[T IntNumber | ~float64 | ~float32](n T) string {
|
||||||
return fmt.Sprintf("%v", n)
|
return fmt.Sprintf("%v", n)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Slice[T any](arr []T, offset, length int) (r []T) {
|
||||||
|
l := len(arr)
|
||||||
|
if length == 0 {
|
||||||
|
length = l - offset
|
||||||
|
}
|
||||||
|
if l > offset && l >= offset+length {
|
||||||
|
r = append(make([]T, 0, length), arr[offset:offset+length]...)
|
||||||
|
arr = append(arr[:offset], arr[offset+length:]...)
|
||||||
|
} else if l <= offset {
|
||||||
|
return
|
||||||
|
} else if l > offset && l < offset+length {
|
||||||
|
r = append(make([]T, 0, length), arr[offset:]...)
|
||||||
|
arr = arr[:offset]
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func Comb[T any](arr []T, m int) (r [][]T) {
|
||||||
|
r = make([][]T, 0)
|
||||||
|
if m == 1 {
|
||||||
|
for _, t := range arr {
|
||||||
|
r = append(r, []T{t})
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
l := len(arr) - m
|
||||||
|
for i := 0; i <= l; i++ {
|
||||||
|
next := Slice(arr, i+1, 0)
|
||||||
|
nexRes := Comb(next, m-1)
|
||||||
|
for _, re := range nexRes {
|
||||||
|
t := append([]T{arr[i]}, re...)
|
||||||
|
r = append(r, t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
|
@ -797,3 +797,114 @@ func TestNumberToString(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSlice(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
arr []int
|
||||||
|
offset int
|
||||||
|
length int
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
wantR []int
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "t1",
|
||||||
|
args: args{
|
||||||
|
arr: RangeSlice(1, 10, 1),
|
||||||
|
offset: 3,
|
||||||
|
length: 2,
|
||||||
|
},
|
||||||
|
wantR: RangeSlice(4, 5, 1),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "t2",
|
||||||
|
args: args{
|
||||||
|
arr: RangeSlice(1, 10, 1),
|
||||||
|
offset: 3,
|
||||||
|
length: 0,
|
||||||
|
},
|
||||||
|
wantR: RangeSlice(4, 10, 1),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if gotR := Slice(tt.args.arr, tt.args.offset, tt.args.length); !reflect.DeepEqual(gotR, tt.wantR) {
|
||||||
|
t.Errorf("Slice() = %v, want %v", gotR, tt.wantR)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestComb(t *testing.T) {
|
||||||
|
type args struct {
|
||||||
|
arr []int
|
||||||
|
m int
|
||||||
|
}
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
args args
|
||||||
|
wantR [][]int
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "t1",
|
||||||
|
args: args{
|
||||||
|
arr: RangeSlice(1, 5, 1),
|
||||||
|
m: 2,
|
||||||
|
},
|
||||||
|
wantR: [][]int{
|
||||||
|
{1, 2},
|
||||||
|
{1, 3},
|
||||||
|
{1, 4},
|
||||||
|
{1, 5},
|
||||||
|
{2, 3},
|
||||||
|
{2, 4},
|
||||||
|
{2, 5},
|
||||||
|
{3, 4},
|
||||||
|
{3, 5},
|
||||||
|
{4, 5},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "t2",
|
||||||
|
args: args{
|
||||||
|
arr: RangeSlice(1, 5, 1),
|
||||||
|
m: 3,
|
||||||
|
},
|
||||||
|
wantR: [][]int{
|
||||||
|
{1, 2, 3},
|
||||||
|
{1, 2, 4},
|
||||||
|
{1, 2, 5},
|
||||||
|
{1, 3, 4},
|
||||||
|
{1, 3, 5},
|
||||||
|
{1, 4, 5},
|
||||||
|
{2, 3, 4},
|
||||||
|
{2, 3, 5},
|
||||||
|
{2, 4, 5},
|
||||||
|
{3, 4, 5},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "t3",
|
||||||
|
args: args{
|
||||||
|
arr: RangeSlice(1, 5, 1),
|
||||||
|
m: 4,
|
||||||
|
},
|
||||||
|
wantR: [][]int{
|
||||||
|
{1, 2, 3, 4},
|
||||||
|
{1, 2, 3, 5},
|
||||||
|
{1, 2, 4, 5},
|
||||||
|
{1, 3, 4, 5},
|
||||||
|
{2, 3, 4, 5},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tt := range tests {
|
||||||
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
if gotR := Comb(tt.args.arr, tt.args.m); !reflect.DeepEqual(gotR, tt.wantR) {
|
||||||
|
t.Errorf("Comb() = %v, want %v", gotR, tt.wantR)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user