我试图找到最简洁、简短、简洁的方式来表达查找**字符串中出现频率最高的字符 * a的算法。我的算法如下:1.遍历字符串的每个character1.对于每个character,使用hashValue构造一个散列表,该散列表具有一个指示特定散列键出现次数的属性1.遍历哈希表并找到最大值,然后将密钥解哈希返回到a character这是我的解决方案。我在接近尾声时遇到了障碍;我已经通过该算法正确地定位了最大的hashValue,但我不知道如何将哈希键Map回字符。
character
hashValue
uinbv5nw1#
基于@hennes的解决方案甚至还有一个更短的解决方案:
let string = "abbcde" var counters = [Character: Int]() for c in string { counters[c] = (counters[c] ?? 0) + 1 } let maxElement = counters.reduce(counters.first!) { $1.1 > $0.1 ? $1 : $0 } print(maxElement.0) // prints "b"
6fe3ivhb2#
你可以只使用字符本身作为字典的关键字。
let string = "abbcde" var counters = [Character: Int]() for c in string { if let count = counters[c] { counters[c] = count + 1 } else { counters[c] = 1 } } let maxElement = counters.reduce(counters.first!) { $1.1 > $0.1 ? $1 : $0 } print(maxElement.0) // prints "b"
更新为swift 4语法。
rqqzpn5f3#
这将只迭代序列一次:
extension SequenceType where Generator.Element : Hashable { func mostFrequent() -> Generator.Element? { var freqs: [Generator.Element:Int] = [:] return maxElement { (bc, ec) in let en = freqs[ec]?.successor() ?? 1 freqs[ec] = en return en > freqs[bc] } } } "aabcccdee" // "c" .characters .mostFrequent()
[001 pdf 1st-31 files]或者,如果您想真正成为高尔夫球手:
extension SequenceType where Generator.Element : Hashable { func mostFrequent() -> Generator.Element? { var fs: [Generator.Element:Int] = [:] return maxElement { (bc, ec) in fs[ec]?++ ?? fs.updateValue(1, forKey: ec) >= fs[bc] } } } "aaaabcccdee" .characters .mostFrequent()
在方法之外:
var fs: [Character:Int] = [:] let mostFrequent = "aaaeabcceced".characters .maxElement { (bc, ec) in fs[ec]?++ ?? fs.updateValue(1, forKey: ec) >= fs[bc] }
3条答案
按热度按时间uinbv5nw1#
基于@hennes的解决方案甚至还有一个更短的解决方案:
6fe3ivhb2#
你可以只使用字符本身作为字典的关键字。
更新为swift 4语法。
rqqzpn5f3#
这将只迭代序列一次:
[001 pdf 1st-31 files]或者,如果您想真正成为高尔夫球手:
在方法之外: