首页 > 解决方案 > Dart - 查找字符串中最常见的字符

问题描述

我被困在这个使用 Dart 的常见面试问题上。我需要返回给定字符串中最常见的字符。作为第一步,我正在尝试创建一个包含每个字符计数的地图。

这是我到目前为止的进展:

main(List<String> arguments) {
  maxChar('hello');
}

void maxChar(String word) {
  Map<String, int> charMap = {};
  int max = 0;
  String maxChar = '';
  word.split('').forEach((char) {
    if(charMap.containsValue(char)) {
      charMap[char]+1;
      return;
    } else {
      charMap[char] = 1;
    }
  });
  print(charMap);
}

现在它甚至没有计算字母“l”的正确数量。它正在输出:

{h: 1, e: 1, l: 1, o: 1}

我究竟做错了什么?有没有更简单的方法来返回 Dart 中字符串中最常见的字符?

谢谢!

编辑:

好的,我已经解决了,但肯定有更简洁的方法来解决这个问题。请参阅下面的解决方案:

main(List<String> arguments) {
  print(max_char.maxChar('hello'));
}

String maxChar(String word) {
  Map<String, int> charMap = {};
  int max = -1;
  String maxChar = '';
  word.split('').forEach((char) {
    if(charMap.containsKey(char)) {
      charMap[char]++;
      return;
    } else {
      charMap[char] = 1;
    }
  });
  charMap.forEach((k,v) {
    if(v > max) {
      max = v;
      maxChar = k;
    }
  });
  return maxChar;
}

标签: dart

解决方案


绝对可以使用更短的方法来计算字符:

String charCount(String chars) {
  int maxChar = -1;
  int maxCount = 0;
  var counts = <int, int>{};
  for (var char in chars.runes) {
    int count = counts.update(char, (n) => n + 1, ifAbsent: () => 1);
    if (count > maxCount) {
      maxCount = count;
      maxChar = char;
    }
  }
  return String.fromCharCode(maxChar);
}

如果你只想计算字符,你可以删除所有提到maxCount和的行maxChar

我使用整数来表示字符而不是字符串。这更便宜且同样精确,它允许您识别和组合 Unicode UTF-16 代理项。


推荐阅读