swift2 查找字符串中出现频率最高的字符

vlf7wbxs  于 2022-11-06  发布在  Swift
关注(0)|答案(3)|浏览(170)

我试图找到最简洁简短简洁的方式来表达查找**字符串中出现频率最高的字符 * a的算法。
我的算法如下:
1.遍历字符串的每个character
1.对于每个character,使用hashValue构造一个散列表,该散列表具有一个指示特定散列键出现次数的属性
1.遍历哈希表并找到最大值,然后将密钥解哈希返回到a character
这是我的解决方案。我在接近尾声时遇到了障碍;我已经通过该算法正确地定位了最大的hashValue,但我不知道如何将哈希键Map回字符。

uinbv5nw

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"
6fe3ivhb

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语法。

rqqzpn5f

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] }

相关问题