feat(Go-Tool):2021/03/18:新增超过半数数字系列算法题,新增出现次数不同的数字系列算法题
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
* @Author : huangzj
|
||||
* @Time : 2021/3/16 15:45
|
||||
* @Description:
|
||||
*/
|
||||
|
||||
package NumberMoreThan
|
||||
|
||||
type NumberMoreThanHalfObj struct{}
|
||||
|
||||
func (n *NumberMoreThanHalfObj) Doc() string {
|
||||
return `
|
||||
题目:
|
||||
|
||||
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
|
||||
|
||||
例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
|
||||
|
||||
要求:时间复杂度O(N),空间复杂度O(1)
|
||||
`
|
||||
}
|
||||
|
||||
func NumberMoreThanHalf(numList []int) int {
|
||||
var number, count int
|
||||
for _, j := range numList {
|
||||
if number == j {
|
||||
count++
|
||||
} else if number != j && count <= 1 {
|
||||
number = j
|
||||
} else {
|
||||
//number !=j && count >1
|
||||
count--
|
||||
}
|
||||
}
|
||||
|
||||
//最后验证,确保一定超过
|
||||
countValid := 0
|
||||
for _, j := range numList {
|
||||
if j == number {
|
||||
countValid++
|
||||
}
|
||||
}
|
||||
if countValid <= len(numList)/2 {
|
||||
return -1
|
||||
}
|
||||
|
||||
return number
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* @Author : huangzj
|
||||
* @Time : 2021/3/16 16:23
|
||||
* @Description:
|
||||
*/
|
||||
|
||||
package NumberMoreThan
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestNumberMoreThanHalf(t *testing.T) {
|
||||
fmt.Println(NumberMoreThanHalf([]int{1, 2, 3})) //-1
|
||||
fmt.Println(NumberMoreThanHalf([]int{1, 2, 3, 1, 1})) //1
|
||||
fmt.Println(NumberMoreThanHalf([]int{1, 2, 3, 1})) //-1
|
||||
fmt.Println(NumberMoreThanHalf([]int{1, 2, 3, 2, 3, 2, 3, 3})) //-1
|
||||
fmt.Println(NumberMoreThanHalf([]int{1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1})) //1
|
||||
}
|
||||
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* @Author : huangzj
|
||||
* @Time : 2021/3/16 16:46
|
||||
* @Description:
|
||||
*/
|
||||
|
||||
package NumberMoreThan
|
||||
|
||||
type NumberMoreThanKObj struct{}
|
||||
|
||||
func (*NumberMoreThanKObj) Doc() string {
|
||||
return `
|
||||
给定一个整型数组arr(数组长度为N) 与一个整数k,打印所有出现次数大于 N/K 的数。如果没有这样的数,返回-1。
|
||||
|
||||
要求:时间复杂度为O(N*K),额外空间复杂度为O(K)。
|
||||
`
|
||||
}
|
||||
|
||||
func NumberMoreThanK(numList []int, k int) []int {
|
||||
//小于2的情况是肯定不会超过.
|
||||
if k < 2 {
|
||||
return []int{}
|
||||
}
|
||||
|
||||
//用来保存数字与其出现次数
|
||||
numMap := make(map[int]int, 0)
|
||||
for _, num := range numList {
|
||||
//如果不存在则数值设置为1
|
||||
if _, ok := numMap[num]; !ok {
|
||||
numMap[num] = 1
|
||||
} else {
|
||||
//存在则出现次数+1
|
||||
numMap[num] = numMap[num] + 1
|
||||
}
|
||||
//当容器的大小为k
|
||||
if len(numMap) == k {
|
||||
for key, value := range numMap {
|
||||
//个数正好等于1的要删掉,因为本次减一之后,就等于0了
|
||||
if value == 1 {
|
||||
delete(numMap, key)
|
||||
}
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//map的key是可能出现次数超过N/k的数
|
||||
//这里主要是为了拿到key
|
||||
for key := range numMap {
|
||||
numMap[key] = 0
|
||||
}
|
||||
//重新计算对应数字的出现次数
|
||||
for _, num := range numList {
|
||||
if _, ok := numMap[num]; ok {
|
||||
numMap[num]++
|
||||
}
|
||||
}
|
||||
//出现次数超过k次的判断
|
||||
result := make([]int, 0)
|
||||
for key, value := range numMap {
|
||||
if value > len(numList)/k {
|
||||
result = append(result, key)
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
/*
|
||||
* @Author : huangzj
|
||||
* @Time : 2021/3/16 16:59
|
||||
* @Description:
|
||||
*/
|
||||
|
||||
package NumberMoreThan
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestNumberMoreThanK(t *testing.T) {
|
||||
fmt.Println(NumberMoreThanK([]int{1, 2, 3, 1, 2, 3, 1, 2, 3, 1}, 3)) //1
|
||||
fmt.Println(NumberMoreThanK([]int{1, 2, 3, 1, 2, 3, 1, 2, 3, 1}, 4)) //1,2,3
|
||||
fmt.Println(NumberMoreThanK([]int{1, 2, 3, 1, 2, 3, 1, 2, 3}, 2)) //
|
||||
fmt.Println(NumberMoreThanK([]int{1, 2, 3}, 2)) //
|
||||
}
|
||||
Reference in New Issue
Block a user