Skip to content

Commit

Permalink
refactor: reduce a cognitive complexity (#18)
Browse files Browse the repository at this point in the history
  • Loading branch information
arttet authored Oct 20, 2024
1 parent 77422cb commit 71afcf8
Show file tree
Hide file tree
Showing 3 changed files with 100 additions and 57 deletions.
24 changes: 24 additions & 0 deletions .codeclimate.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
---
engines:
golint:
enabled: true
checks:
GoLint/Naming/MixedCaps:
enabled: true
govet:
enabled: true
gofmt:
enabled: true
fixme:
enabled: true
markdownlint:
enabled: true
shellcheck:
enabled: true
ratings:
paths:
- '**.go'
exclude_paths:
- '**/*_test.go'
- '*_test.go'
- 'vendor/'
Original file line number Diff line number Diff line change
Expand Up @@ -10,59 +10,70 @@ const maxExpenditure = 201

func activityNotifications(expenditures []int, d int) int {
var notifications int
var i, j int
histogram := buildHistogram(expenditures[:d])

histogram := make([]int, maxExpenditure)
for i = 0; i < d; i++ { //nolint: intrange
histogram[expenditures[i]]++
for n, i := len(expenditures), d; i < n; i++ {
doubleMedian := calculateDoubleMedian(histogram, d)

if expenditures[i] >= doubleMedian {
notifications++
}

// Update histogram: slide window 1 index to right
updateHistogram(histogram, expenditures[i-d], expenditures[i])
}

for n := len(expenditures); i < n; i++ {
doubleMedian := 0
return notifications
}

cursor := 0
left := -1
func buildHistogram(expenditures []int) []int {
histogram := make([]int, maxExpenditure)
for _, exp := range expenditures {
histogram[exp]++
}

for j = range maxExpenditure {
cursor += histogram[j]
if d%2 == 1 { //nolint: nestif
// Odd -> Pick middle one for median
if cursor >= d/2+1 {
doubleMedian = 2 * j
return histogram
}

break
}
} else {
// Even -> Pick average of two middle values for median
if cursor == d/2 {
left = j
}
func calculateDoubleMedian(histogram []int, days int) int {
var doubleMedian int

if cursor > d/2 && left != -1 {
right := j
doubleMedian = left + right
cursor := 0
left := -1

break
}
for j := range maxExpenditure {
cursor += histogram[j]

if cursor > d/2 && left == -1 {
doubleMedian = 2 * j
if days%2 == 1 { //nolint: nestif
// Odd
if cursor >= days/2+1 {
doubleMedian = 2 * j

break
}
break
}
}
} else {
// Even
if cursor == days/2 {
left = j
}
if cursor > days/2 {
if left != -1 {
doubleMedian = left + j
} else {
doubleMedian = 2 * j
}

if expenditures[i] >= doubleMedian {
notifications++
break
}
}

// Update histogram: slide window 1 index to right
histogram[expenditures[i-d]]--
histogram[expenditures[i]]++
}

return notifications
return doubleMedian
}

func updateHistogram(histogram []int, outgoing, incoming int) {
histogram[outgoing]--
histogram[incoming]++
}

func main() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,31 @@ const (
CheckCase
)

func insertValue(value int, number, frequency map[int]int) {
freq := number[value]
number[value]++
frequency[number[value]]++
if freq > 0 {
frequency[freq]--
}
}

func deleteValue(value int, number, frequency map[int]int) {
if freq, ok := number[value]; ok {
number[value]--
if number[value] == 0 {
delete(number, value)
} else {
frequency[number[value]]++
}

frequency[freq]--
if frequency[freq] == 0 {
delete(frequency, freq)
}
}
}

func frequencyQueries(queries [][]int) []int {
var result []int

Expand All @@ -21,26 +46,9 @@ func frequencyQueries(queries [][]int) []int {
for _, query := range queries {
switch action, value := query[0], query[1]; action {
case InsertCase:
freq := number[value]
number[value]++
frequency[number[value]]++
if freq > 0 {
frequency[freq]--
}
insertValue(value, number, frequency)
case DeleteCase:
if freq, ok := number[value]; ok {
number[value]--
if number[value] == 0 {
delete(number, value)
} else {
frequency[number[value]]++
}

frequency[freq]--
if frequency[freq] == 0 {
delete(frequency, freq)
}
}
deleteValue(value, number, frequency)
case CheckCase:
item := 0
if freq, ok := frequency[value]; ok && freq > 0 {
Expand Down

0 comments on commit 71afcf8

Please sign in to comment.