Дан целочисленный слайс, индексы в нем это индексы статей, а элементы - это количество цитат приходящиеся на опубликованную статью.
Задача рассчитать индекс Хирша
| Go | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
| // [url]https://leetcode.com/studyplan/top-interview-150/[/url]
package topInterview
import (
"sort"
)
// hIndex
//
// 274. H-Index
//
// Given an array of integers citations where citations[i] is the number of citations a researcher received for their ith paper, return the researcher's h-index.
//
// According to the definition of h-index on Wikipedia: The h-index is defined as the maximum value of h such that the given researcher has published at least h papers that have each been cited at least h times.
//
// Example 1:
//
// Input: citations = [3,0,6,1,5]
// Output: 3
// Explanation: [3,0,6,1,5] means the researcher has 5 papers in total and each of them had received 3, 0, 6, 1, 5 citations respectively.
// Since the researcher has 3 papers with at least 3 citations each and the remaining two with no more than 3 citations each, their h-index is 3.
// Example 2:
//
// Input: citations = [1,3,1]
// Output: 1
//
// Constraints:
//
// n == citations.length
// 1 <= n <= 5000
// 0 <= citations[i] <= 1000//
func hIndex(citations []int) int {
// Воспользуюсь сортировкой целочисленных слайсов с произвольной функцией сортировки
// Отсортировать слайс по убыванию
sort.Slice(citations, func(i, j int) bool {
return citations[i] > citations[j]
})
// Переменная hIndexValue содержит крайний h-индекс подходящий под критерии
hIndexValue := 0
// Цикл range по элементам слайса citations
// i индекс текущего элемента слайса
// v значение текущего элемента слайса
for i, v := range citations {
// если значение текущего элемента слайса больше индекса элемента
if v >= i+1 {
// Обновляем hIndexValue становится индексом текущего элемента плюс единица так как чети индекса ведется с единицы
hIndexValue = i + 1
// Прервать итерацию цикла
continue
}
// Прервать цикл
break
}
// Вернуть значение h-индекса
return hIndexValue
} |
|
| Go | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| func TestHIndex(t *testing.T) {
data := []struct {
citations []int
expected int
}{
{
[]int{3, 0, 6, 1, 5},
3,
},
{
[]int{1, 3, 1},
1,
},
}
for i, datum := range data {
result := hIndex(datum.citations)
if result != datum.expected {
t.Errorf("unexpected result for test index %d expected [%+v] got [%+v]", i, datum.expected, result)
}
}
} |
|
| Code | 1
2
3
| === RUN TestHIndex
--- PASS: TestHIndex (0.00s)
PASS |
|
| https://github.com/alhaos/problems
|