generated from OtusGolang/home_work
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
171 additions
and
4 deletions.
There are no files selected for viewing
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,173 @@ | ||
// package main | ||
|
||
package hw03frequencyanalysis | ||
|
||
func Top10(_ string) []string { | ||
// Place your code here. | ||
return nil | ||
import ( | ||
"sort" | ||
"strings" | ||
) | ||
|
||
type NodeValue struct { | ||
Word string | ||
Count int | ||
} | ||
|
||
type Node struct { | ||
Left *Node | ||
Value NodeValue | ||
Right *Node | ||
} | ||
|
||
func Insert(node *Node, value NodeValue) { | ||
if value.Count > node.Value.Count { | ||
if node.Right == nil { | ||
node.Right = &Node{nil, value, nil} | ||
} else { | ||
Insert(node.Right, value) | ||
} | ||
} | ||
if value.Count <= node.Value.Count { | ||
if node.Left == nil { | ||
node.Left = &Node{nil, value, nil} | ||
} else { | ||
Insert(node.Left, value) | ||
} | ||
} | ||
} | ||
|
||
func MakeSortedArray(node *Node, nums *[]NodeValue) { | ||
if len(*nums) > 10 { | ||
return | ||
} | ||
|
||
if node.Right == nil { | ||
*nums = append(*nums, node.Value) | ||
} else { | ||
MakeSortedArray(node.Right, nums) | ||
*nums = append(*nums, node.Value) | ||
} | ||
|
||
if node.Left == nil { | ||
lIndex := len(*nums) | ||
if lIndex > 0 && node.Value.Word != ((*nums)[lIndex-1]).Word { | ||
*nums = append(*nums, node.Value) | ||
} | ||
} else { | ||
MakeSortedArray(node.Left, nums) | ||
} | ||
} | ||
|
||
func SortSubslices(values *[]NodeValue) []string { | ||
result := &[]string{} | ||
sl := &[]string{} | ||
var previous *NodeValue | ||
for i := range *values { | ||
nodeValue := (*values)[i] | ||
|
||
if previous == nil { | ||
previous = &nodeValue | ||
*sl = append(*sl, nodeValue.Word) | ||
continue | ||
} | ||
|
||
if previous.Count == nodeValue.Count { | ||
*sl = append(*sl, nodeValue.Word) | ||
previous = &nodeValue | ||
} else { | ||
sort.Strings(*sl) | ||
*result = append(*result, *sl...) | ||
previous = nil | ||
sl = &[]string{} | ||
*sl = append(*sl, nodeValue.Word) | ||
} | ||
} | ||
sort.Strings(*sl) | ||
*result = append(*result, *sl...) | ||
|
||
if len(*result)-1 > 11 { | ||
return (*result)[0:10] | ||
} | ||
return *result | ||
} | ||
|
||
func CleanAll(str string) string { | ||
str = strings.ReplaceAll(str, "\n", " ") | ||
str = strings.ReplaceAll(str, "\t", " ") | ||
// str = strings.TrimRight(str, "\r\n") | ||
// str = strings.TrimSuffix(str, "\r\n") | ||
return str | ||
} | ||
|
||
func Top10(str string) []string { | ||
|
||
if len(str) == 0 { | ||
return []string{} | ||
} | ||
str = CleanAll(str) | ||
wordsFrequency := make(map[string]int) | ||
for _, word := range strings.Split(str, " ") { | ||
if len(word) > 0 { | ||
wordsFrequency[word] += 1 | ||
} | ||
} | ||
var root *Node | ||
for k, v := range wordsFrequency { | ||
value := NodeValue{k, v} | ||
if root == nil { | ||
root = &Node{nil, value, nil} | ||
continue | ||
} | ||
Insert(root, value) | ||
} | ||
maxNums := &[]NodeValue{} | ||
MakeSortedArray(root, maxNums) | ||
result := SortSubslices(maxNums) | ||
return result | ||
} | ||
|
||
// func main() { | ||
// str := text_2 | ||
// //// fmt.Println("input:", str) | ||
// result := Top10(str) | ||
// //// fmt.Println("result:", result) | ||
// for k := range result { | ||
// fmt.Println("r => :", result[k]) | ||
// } | ||
// } | ||
|
||
var text_1 = "cat and dog, one dog,two cats and one man" | ||
|
||
// "он", "а", "и", "ты", "что", "-", "Кристофер", "если", "не", "то", | ||
var text_2 = `Как видите, он спускается по лестнице вслед за своим | ||
другом Кристофером Робином, головой вниз, пересчитывая | ||
ступеньки собственным затылком: бум-бум-бум. Другого способа | ||
сходить с лестницы он пока не знает. Иногда ему, правда, | ||
кажется, что можно бы найти какой-то другой способ, если бы он | ||
только мог на минутку перестать бумкать и как следует | ||
сосредоточиться. Но увы - сосредоточиться-то ему и некогда. | ||
Как бы то ни было, вот он уже спустился и готов с вами | ||
познакомиться. | ||
- Винни-Пух. Очень приятно! | ||
Вас, вероятно, удивляет, почему его так странно зовут, а | ||
если вы знаете английский, то вы удивитесь еще больше. | ||
Это необыкновенное имя подарил ему Кристофер Робин. Надо | ||
вам сказать, что когда-то Кристофер Робин был знаком с одним | ||
лебедем на пруду, которого он звал Пухом. Для лебедя это было | ||
очень подходящее имя, потому что если ты зовешь лебедя | ||
громко: "Пу-ух! Пу-ух!"- а он не откликается, то ты всегда | ||
можешь сделать вид, что ты просто понарошку стрелял; а если ты | ||
звал его тихо, то все подумают, что ты просто подул себе на | ||
нос. Лебедь потом куда-то делся, а имя осталось, и Кристофер | ||
Робин решил отдать его своему медвежонку, чтобы оно не пропало | ||
зря. | ||
А Винни - так звали самую лучшую, самую добрую медведицу | ||
в зоологическом саду, которую очень-очень любил Кристофер | ||
Робин. А она очень-очень любила его. Ее ли назвали Винни в | ||
честь Пуха, или Пуха назвали в ее честь - теперь уже никто не | ||
знает, даже папа Кристофера Робина. Когда-то он знал, а теперь | ||
забыл. | ||
Словом, теперь мишку зовут Винни-Пух, и вы знаете почему. | ||
Иногда Винни-Пух любит вечерком во что-нибудь поиграть, а | ||
иногда, особенно когда папа дома, он больше любит тихонько | ||
посидеть у огня и послушать какую-нибудь интересную сказку. | ||
В этот вечер...` |