【问题标题】:Implement an algorithm in Scala to determin if a string has all unique characters在 Scala 中实现一个算法来确定一个字符串是否具有所有唯一字符
【发布时间】:2017-12-12 22:13:55
【问题描述】:

我正在解决一些琐碎的问题来学习 Scala。这是我想出的

def isUnique(str: String): Boolean = {
    if (str.length > 128) return false
    val uniqueChars = new Array[Boolean](128)

    !(str.map(c => addChar(c, uniqueChars)).find(identity).isDefined)
}

def addChar(ch: Char, uniqueChars: Array[Boolean]): Boolean = {
    if (uniqueChars(ch)) return true else {
    uniqueChars(ch) = true;
    return false
}

是这样吗?

请注意,此时我并不关心逻辑或优化。我只需要学习 Scala 的做法。

[编辑] 假设我们不想使用 string distinct 方法。我只需要验证Scala的函数风格。

【问题讨论】:

  • str.length == str.distinct.length
  • 糟糕!这更直接:str == str.distinct
  • @jwvh 谢谢...我不知道这种方法。你能在问题中看到我的编辑吗?假设我们不想使用 distinct。

标签: scala functional-programming


【解决方案1】:

好的,所以如果您不想使用 distinct 库方法,那么递归通常是函数式方法。

def isUnique(str: String, chrs: Set[Char] = Set()): Boolean =
  str.length == 0 ||
    !chrs(str.head) &&
      isUnique(str.tail, chrs + str.head)

isUnique("abcdexf")  // true
isUnique("abcdxxf")  // false
isUnique("fbcdexf")  // false
isUnique("abdbexf")  // false

【讨论】:

  • 相当漂亮!不过,我花了一分钟的时间来解决这个问题。谢谢!
  • 既然你用的是集合,为什么不用str.toSet.size == str.size
  • @RomainG;由于 distinct 已被拒绝,并且要求“功能样式”,我认为通过递归提前终止的演示可能是 OP 正在寻找的。​​span>
【解决方案2】:

您想“学习 scala 的做法”,实际上是以一种在 scala 中使用没有意义的方式来做这件事? Scala 的做法str == str.distinct。如果“你不想使用distinct”,那么str.toSet.size == str.length。如果你也不想要toSet,那么str.groupBy(identity).values.map(_.size).forall(_ == 1)。 如果你不想要.groupBy 那么 str.sorted.sliding(2).forall(s => s.head != s.last)

等等。 ...在某些时候,“scala way”不再是“scala way”,而是用scala语法编写的java程序。

【讨论】:

  • 我不想让它成为 Java。我想知道你将如何在 Scala 中实现不同的方法。我确信它不是使用 Java 或 groupBy 或排序实现的。另请参阅上面接受的答案。 (仅供参考,我没有否决您的回答)。
猜你喜欢
  • 2013-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
相关资源
最近更新 更多