187 lines
3.9 KiB
Plaintext
187 lines
3.9 KiB
Plaintext
package mathUtil
|
||
|
||
import (
|
||
"sort"
|
||
)
|
||
|
||
// 判断传入的byte型数组是否连续
|
||
func IsContinuous_byte(list []byte) bool {
|
||
if len(list) == 0 || len(list) == 1 {
|
||
return true
|
||
}
|
||
|
||
list_int64 := make([]int64, len(list), len(list))
|
||
for i, v := range list {
|
||
list_int64[i] = int64(v)
|
||
}
|
||
|
||
return IsContinuous_int64(list_int64)
|
||
}
|
||
|
||
// 判断传入的int型数组是否连续
|
||
func IsContinuous_int(list []int) bool {
|
||
if len(list) == 0 || len(list) == 1 {
|
||
return true
|
||
}
|
||
|
||
list_int64 := make([]int64, len(list), len(list))
|
||
for i, v := range list {
|
||
list_int64[i] = int64(v)
|
||
}
|
||
|
||
return IsContinuous_int64(list_int64)
|
||
}
|
||
|
||
// 判断传入的int型数组是否连续
|
||
func IsContinuous_int32(list []int32) bool {
|
||
if len(list) == 0 || len(list) == 1 {
|
||
return true
|
||
}
|
||
|
||
list_int64 := make([]int64, len(list), len(list))
|
||
for i, v := range list {
|
||
list_int64[i] = int64(v)
|
||
}
|
||
|
||
return IsContinuous_int64(list_int64)
|
||
}
|
||
|
||
// 判断传入的int型数组是否连续
|
||
func IsContinuous_int64(list []int64) bool {
|
||
if len(list) == 0 || len(list) == 1 {
|
||
return true
|
||
}
|
||
|
||
if int64(len(list)) != list[len(list)-1]-list[0]+1 {
|
||
return false
|
||
}
|
||
|
||
for i := 0; i < len(list)-1; i++ {
|
||
if list[i]+1 != list[i+1] {
|
||
return false
|
||
}
|
||
}
|
||
|
||
return true
|
||
}
|
||
|
||
// 判断区间是否连续
|
||
func IsContinuous_Region(list []*IntRegion) bool {
|
||
if len(list) == 0 || len(list) == 1 {
|
||
return true
|
||
}
|
||
|
||
sort.Slice(list, func(i, j int) bool { return list[i].Lower < list[j].Lower })
|
||
|
||
for i := 0; i < len(list)-1; i++ {
|
||
if list[i].IsSorted() == false || list[i+1].IsSorted() == false {
|
||
return false
|
||
}
|
||
|
||
if list[i].Upper+1 != list[i+1].Lower {
|
||
return false
|
||
}
|
||
}
|
||
|
||
return true
|
||
}
|
||
|
||
// 判断传入的概率是否全覆盖
|
||
func IsOddFullConvered(list []*IntRegion, min, max int) bool {
|
||
if len(list) == 0 {
|
||
return false
|
||
}
|
||
|
||
if list[0].Lower != min || list[len(list)-1].Upper != max {
|
||
return false
|
||
}
|
||
|
||
sort.Slice(list, func(i, j int) bool { return list[i].Lower < list[j].Lower })
|
||
|
||
for i := 0; i < len(list)-1; i++ {
|
||
if list[i].IsSorted() == false || list[i+1].IsSorted() == false {
|
||
return false
|
||
}
|
||
|
||
if list[i].Upper+1 != list[i+1].Lower {
|
||
return false
|
||
}
|
||
}
|
||
|
||
return true
|
||
}
|
||
|
||
func IsDistinct_byte(list []byte) (result bool) {
|
||
if len(list) == 0 || len(list) == 1 {
|
||
result = true
|
||
return
|
||
}
|
||
|
||
list_int64 := make([]int64, len(list), len(list))
|
||
for i, v := range list {
|
||
list_int64[i] = int64(v)
|
||
}
|
||
|
||
return IsDistinct_int64(list_int64)
|
||
}
|
||
|
||
func IsDistinct_int(list []int) (result bool) {
|
||
if len(list) == 0 || len(list) == 1 {
|
||
result = true
|
||
return
|
||
}
|
||
|
||
list_int64 := make([]int64, len(list), len(list))
|
||
for i, v := range list {
|
||
list_int64[i] = int64(v)
|
||
}
|
||
|
||
return IsDistinct_int64(list_int64)
|
||
}
|
||
|
||
func IsDistinct_int32(list []int32) (result bool) {
|
||
if len(list) == 0 || len(list) == 1 {
|
||
result = true
|
||
return
|
||
}
|
||
|
||
list_int64 := make([]int64, len(list), len(list))
|
||
for i, v := range list {
|
||
list_int64[i] = int64(v)
|
||
}
|
||
|
||
return IsDistinct_int64(list_int64)
|
||
}
|
||
|
||
// 判断int64数组是否内容唯一
|
||
func IsDistinct_int64(list []int64) (result bool) {
|
||
if len(list) == 0 || len(list) == 1 {
|
||
result = true
|
||
return
|
||
}
|
||
|
||
sort.Slice(list, func(i, j int) bool { return list[i] < list[j] })
|
||
|
||
for i := 0; i < len(list)-1; i++ {
|
||
if list[i] == list[i+1] {
|
||
result = false
|
||
return
|
||
}
|
||
}
|
||
|
||
result = true
|
||
return
|
||
}
|
||
|
||
//// 将int转成uint类型(因goutil指定go版本过低,不支持泛型,未实际加入;要使用的人取消注释,并指定允许泛型的go版本)
|
||
//// 应用场景:atomic.AddUint64 想减1时
|
||
////
|
||
//// x := uint64(1000)
|
||
//// y := int64(-1)
|
||
//// atomic.AddUint64(&x, intToUint[int64, uint64](y))
|
||
//func intToUint[T1 int8 | int16 | int32 | int64 | int, T2 uint8 | uint16 | uint32 | uint64 | uint](x T1) T2 {
|
||
// // 写到函数内,两种方式都可以;若直接使用,只能使用^T2(-x - 1);若使用T2(x)方式,x为负值时转为uint类语法检查无法通过
|
||
// return ^T2(-x - 1)
|
||
// // return T2(x)
|
||
//}
|