更新列表的价值与它们的绝对值(Update the values of a list with th

2019-10-19 05:45发布

新手阶。

我试图让这段代码几小时现在的工作。 它的目的是与整数的绝对值来更新列表[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...

没有得到什么是错在这里。

Answer 1:

最好的办法是像@senia的意见建议使用Scala的功能。 例如:

val res = list map math.abs

但是,如果你想修复你的代码只需更换tountil 。 你是一个错误下车:

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;

}

这里的区别是untilto

1 to 3
// Range(1, 2, 3)

1 until 3
// Range(1, 2)

您还可以删除return; 甚至括号{使用if/else



Answer 2:

然而,使用另一个版本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可被省略。



Answer 3:

您可以尝试使用情况报表更加整洁的语法:

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
}


Answer 4:

貌似你试图从解决的挑战在这里 。 也许你可能想要使用递归和不可变List功能更强大的方法。

def f(arr: List[Int]): List[Int] = arr match {
  case Nil => Nil
  case x :: rest => java.lang.Math.abs(x) :: f(rest)
}


Answer 5:

初学者友好:这是我写的

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所有测试



Answer 6:

def f (arr: List[Int]) : List[Int] = {
 arr.map {
     case i if 0 > i => i * -1
     case i => i
 }
}


文章来源: Update the values of a list with their absolute values