我又在做一些代码战争挑战,我有一个关于这个特定问题的问题:
任务:"给定一串单词,返回最短单词的长度。
字符串永远不会为空,你不需要考虑不同的数据类型。
我已经查找了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
}
}
以下是测试:
测试结果:
最短测试 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 Dogcoin 21inc Dash MadeSafeCoin) 应该返回 4 测试失败
1 不等于 4 堆栈跟踪 1ms内完成 findShort(Bitcoin Lisk) 应该返回 4 测试失败 1 不等于 4 堆栈跟踪 1ms内完成 findShort(权益证明瑞波币)应返回 6 测试失败
1 不等于 6 堆栈跟踪 findShort(工作量证明狗狗币BTC经典达世币瑞波币工作量证明)应该返回3 测试失败
1 不等于 3 堆栈跟踪 1ms内完成 findShort(莱特币比特币莱特币比特币波浪比特币破折号波纹币波币以太坊经典事实莱特币事实波浪事实)应该返回 4 测试失败
1 不等于 4 堆栈跟踪 2ms内完成 findShort(Bitcoin Waves MadeSafeCoin DarkCoin ProofOfStake经典BTC)应该返回3 测试失败
1 不等于 3 堆栈跟踪 1ms内完成 findShort(权益证明波以太坊以太坊瑞波币莱特币Steem经典莱特币瑞波币权益证明Steem Monero狗狗币Factom)应返回5 测试失败
您的解决方案实际上还可以,您需要更改的只是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
}
}