Как go через элементы типа string - PullRequest
1 голос
/ 09 июля 2020

Я пишу функцию, которая должна возвращать количество дубликатов. Я не могу понять, как go через элементы строки типа.

func countDuplicates(_ s:String) -> Int {
    var duplicates = 0

    for i in s {
        duplicates += 1
    }

    return duplicates
}

Ответы [ 3 ]

1 голос
/ 09 июля 2020

Можете попробовать:

func countDuplicates(_ s:String) -> Int {
    return s.count - Set(s).count
}

Где:

s.count // total number of characters
Set(s).count // number of unique characters
1 голос
/ 18 июля 2020

Если вы хотите найти общую сумму дубликатов, может быть полезен приведенный ниже код:

let text = "HelloooE"
func numberOfDuplicates(_ s: String) -> Int { s.count - Set(s).count }

print(numberOfDuplicates(text)) //Answer: 3 >> which says one "l" and two "o"s are duplicated.

Но если требуется количество повторяющихся символов, это должен быть ответ:

let text = "HelloooE"
func countOfDuplicateChars(_ s: String) -> Int { s.reduce(into: [:]) {result, word in result[word, default: 0] += 1 }
                                                  .filter { $0.value > 1 }
                                                  .count }

print(countOfDuplicateChars(text)) //Answer: 2 >> which says "l" and "o" are duplicated characters.

Функция ниже также возвращает количество повторяющихся символов и не учитывает регистр:

let text = "HelloooE"
func countOfDuplicateChars_CS(_ s: String) -> Int { s.lowercased()
                                                     .reduce(into: [:]) {result, word in result[word, default: 0] += 1 }
                                                     .filter { $0.value > 1 }
                                                     .count }

print(countOfDuplicateChars(text)) //Answer: 3 >> which says "l", "o" and "e" are duplicated characters.
1 голос
/ 09 июля 2020

Вам не нужно go перебирать строку, чтобы найти количество дубликатов. вы можете просто вычесть количество и недублированную версию с именем Set.

func countDuplicates(_ s: String) -> Int { s.count - Set(s).count) }

Примечание

Вы должны подумать, может быть, там будет более одного дублированного символа. Поэтому вам нужно найти все дубликаты, например, сгруппировав похожие, а затем посчитать их:

let duplications = Dictionary(grouping: text, by: {$0}).map { [$0.key: $0.value.count] }
print(duplications)

Вы можете получить сумму дубликатов, если хотите:

let totalDuplicationCount = dups.filter {$0.count > 1}.reduce(into: 0) { $0 += $1.count - 1 }
print(totalDuplicationCount)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...