用一串字找到最短的字

时间:2019-06-21 11:55:58

标签: string scala shortest

我再次做了一些“代码战争”挑战,对此有一个疑问:

任务:“给定一个字符串,返回最短单词的长度。

字符串永远不会为空,并且您无需考虑其他数据类型。”

我查找了SO上可用的答案,并设法根据国外想法自行创建了程序。

问题在于它仍然无法产生所需的输出。

我遍历了代码,我认为问题出在变量上,而且我无法分配给代码的正确部分。(尽管我可能是错的)

因此,在下面,我附加了代码和测试。

希望,任何人都可以找到问题的答案。

欢呼

object Shortest{
  def findShort(str:String):Int ={

    var smallestLength = 99
    var currentLength = 0

    for(word <- str.split("")) {
      currentLength = 0

      for(letter <- word){
        currentLength +=1
      }

      if(currentLength < smallestLength)
        smallestLength = currentLength         
    }
    smallestLength            
  } 
}

以下是测试:

测试结果:

ShortestTest  findShort(可能是谁知道的比特币接管世界)应该返回3

测试失败 1不等于3  堆栈跟踪 45ms内完成  findShort(发现随机测试用例比编写基本测试用例要容易)应该返回3 测试失败

1不等于3  堆栈跟踪 1ms内完成  findShort(让我们谈论javascript最好的语言)应该返回3 测试失败 1不等于3  堆栈跟踪 1ms内完成  findShort(我想一天游遍世界编写代码)应该返回1  findShort(让所有人去很冷的地方度假)应该返回2 测试失败

1不等于2  堆栈跟踪 1ms内完成  findShort(Steem Dogecoin 21inc Dash MadeSafeCoin)应该返回4 测试失败

1不等于4  堆栈跟踪 1ms内完成  findShort(Bitcoin Lisk)应该返回4 测试失败 1不等于4  堆栈跟踪 1ms内完成  findShort(ProofOfStake Ripple)应该返回6 测试失败

1不等于6  堆栈跟踪  findShort(ProofOfWork狗狗币BTC经典破折号ProofOfWork)应该返回3 测试失败

1不等于3  堆栈跟踪 1ms内完成  findShort(LiteCoin Bitcoin LiteCoin Bitcoin Waves Waves Bitcoin Dash Ripple Ripple Ethereum Classic Factom LiteCoin Factom Waves Factom)应该返回4 测试失败

1不等于4  堆栈跟踪 2ms内完成  findShort(Bitcoin Waves MadeSafeCoin DarkCoin ProofOfStake Classic BTC)应该返回3 测试失败

1不等于3  堆栈跟踪 1ms内完成  findShort(ProofOfStake波以太坊以太坊波纹LiteCoin Steem经典LiteCoin波纹ProofOfStake Steem Monero狗狗币Factom)应该返回5 测试失败

1 个答案:

答案 0 :(得分:4)

实际上您的解决方案还可以,您只需要将str.split("")更改为str.split(" ")(注意空格)即可。

这是一种依靠内置方法来做到这一点的方法:

def findShort(wordsString: String): Int = {
  val wordsArray = wordsString.split(" ")
  wordsArray.minBy(_.length).length
}

println(findShort("LiteCoin Bitcoin LiteCoin Bitcoin Waves Waves Bitcoin Dash Ripple Ripple Ethereum Classic Factom LiteCoin Factom Waves Factom"))
// Display 4
println(findShort("Bitcoin Waves MadeSafeCoin DarkCoin ProofOfStake Classic BTC"))
// Display 3

如果您不想依赖内置方法,那么这里是使用foldLeft的版本:

def length(word: String): Int =
  word.foldLeft(0){case (acc, _) => acc + 1}

def findShort(str:String):Int = {

   str.split(" ").foldLeft(99){ case (smallestLength, word) =>
      val currentLength = length(word)
      if(currentLength < smallestLength)
         currentLength
       else smallestLength
   }
}