新手阶。
我试图让这段代码几小时现在的工作。 它的目的是与整数的绝对值来更新列表[INT](整数列表)。 花了很长的时间来弄清楚,名单是不变的,所以发现ListBuffer可以是救世主,但最终在返回它放回列表的形式看到了一些问题,我猜。
def f (arr:List[Int]) : List[Int] =
{
val list = new scala.collection.mutable.ListBuffer[Int]();
val len = arr.length;
for ( i <- 0 to len)
{
if(arr(i) < 0)
{
list.append((-1)*arr(i)) ;
}
else
{
list.append(arr(i));
}
}
return list.toList;
}
这是给这个错误:
java.lang.IndexOutOfBoundsException: 12
at scala.collection.LinearSeqOptimized$class.apply(LinearSeqOptimized.scala:52)
at scala.collection.immutable.List.apply(List.scala:84)
at Solution$.f(Solution.scala:7)
at Solution$delayedInit$body.apply(Solution.scala:23)
at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
at scala.App$$anonfun$main$1.apply(App.scala:71)
at scala.App$$anonfun$main$1.apply(App.scala:7...
没有得到什么是错在这里。
最好的办法是像@senia的意见建议使用Scala的功能。 例如:
val res = list map math.abs
但是,如果你想修复你的代码只需更换to
与until
。 你是一个错误下车:
def f (arr:List[Int]) : List[Int] =
{
val list = new scala.collection.mutable.ListBuffer[Int]();
val len = arr.length;
for ( i <- 0 until len)
{
if(arr(i) < 0)
{
list.append((-1)*arr(i)) ;
}
else
{
list.append(arr(i));
}
}
return list.toList;
}
这里的区别是until
和to
:
1 to 3
// Range(1, 2, 3)
1 until 3
// Range(1, 2)
您还可以删除return
, ;
甚至括号{
使用if/else
。
然而,使用另一个版本for
理解,避免索引,
def f (arr:List[Int]) : List[Int] =
{
val list = new scala.collection.mutable.ListBuffer[Int]();
for {
a <- arr
sign = if (a < 0) -1 else 1
} list.append(sign * a)
return list.toList;
}
如上所述,所述return
可被省略。
您可以尝试使用情况报表更加整洁的语法:
def f(arr:List[Int]):List[Int] = {
val list = scala.collection.mutable.ListBuffer[Int]()
arr.foreach{
x =>
x match {
case _ if (x <0) => list+= (x*(-1))
case _ => list +=x
}
}
list.toList
}
貌似你试图从解决的挑战在这里 。 也许你可能想要使用递归和不可变List功能更强大的方法。
def f(arr: List[Int]): List[Int] = arr match {
case Nil => Nil
case x :: rest => java.lang.Math.abs(x) :: f(rest)
}
初学者友好:这是我写的
def f(arr: List[Int]) : List[Int] = {
var list = new scala.collection.mutable.ArrayBuffer[Int]();
// var len = arr.length;
for(i <-0 until arr.length) {
list.append( math.abs(arr(i)));
}
return list.toList; }
我没有做任何的时间复杂度分析,但它是最简单的初学者了解。 此外,它通过对hackerrank所有测试
def f (arr: List[Int]) : List[Int] = {
arr.map {
case i if 0 > i => i * -1
case i => i
}
}