Scala 数组 内容整理及课后习题

第3章 数组相关操作

1.编写一段代码,将a设置为一个n个随机整数的数组,要求随机数介于0(包含)和n(不包含)之间。

def fun(n:Int):Array[Int]={
  val a=new Array[Int](n)
  for(i<- 0 until a.length){
    a(i)=Random.nextInt(n)
  }
  return a
}

2.编写一个循环,将整数数组中相邻的元素置换。例如,Array(1,2,3,4,5)经过置换后变为Array(2,1,4,3,5)。

def revBetween(a:Array[Int]):Unit={
  for(i<- 0 until a.length by 2){
    if(i+1==a.length) return 
    val tp=a(i)
    a(i)=a(i+1)
    a(i+1)=tp
  }
}

3.重复前一个练习,不过这一次生成一个新的值交换过的数组。使用for/yield。

def revBetween2(a:Array[Int]):Array[Int]={
  val result=for(i<- a.indices)yield {
    if(i%2==0 && i+1!=a.length) a(i+1)
    else if(i%2==0 && i+1==a.length) a(i)
    else a(i-1)
  }
  return result.toArray
}

4.给定一个整数数组,产生一个新的数组,包含元数组中的所有正值,以原有顺序排列;之后的元素是所有零或负值,以原有顺序排列。

def genNewArray(a:Array[Int]):Array[Int]={
  val b1=ArrayBuffer[Int]()
  val b2=ArrayBuffer[Int]()
  for(elem<-a)
    if(elem>0) b1+=elem else b2+=elem
  b1++=b2
  return b1.toArray
}

不得不说,Scala真好用吖。

5.如何计算Array[Double]的平均值。

def getAverage(a:Array[Double]):Double={
  a.sum/a.length
}

6.如何重新组织Array[Int]的元素将它们以反序排列?对于ArrayBuffer[Int]你又会怎么做呢?

其实不太明白题目的意思,我都用了reverse方法,要注意reverse方法得到的是一个新的数组,原数组不变。

//对于array来说
val b=a.reverse
for(i<- a.indices) a(i)=b(i)
//对于arraybuffer来说
val arbu=ArrayBuffer(1,2,3,4,5)
val arbu2=arbu.reverse
val res=arbu2.toArray

7.编写一段代码,产出数组中的所有值,去掉重复项(提示:Scaladoc。)

a.distinct

8.假定你拿到一个整数的数组缓冲,想要移除第一个负数外的所有负数。以下是一个顺序解决方案,在第一个负数被叫到时设置标记,然后移除所有该标记之后的负数。

val n=a.length
var i=0
while (i=0) i+=1
  else{
    if(first){first=false;i+=1}
    else{a.remove(i);n-=1}
  }
}

这是一个复杂而低效的方案。用Scala重写,采集负数元素的位置,丢弃第一个(位置)元素,反转该序列,然后对每个位置下标调用a.remove(i)。

val a=ArrayBuffer[Int](1,-2,3,-4,5,-10,20)
val len=a.length
val positionsToRemove=for(i<-a.indices if a(i)<0)yield i
val tp=positionsToRemove.drop(1)
for(i<-tp.reverse)  a.remove(i)
a.foreach(print(_))

9.改进前一个练习的方案,采集应被移动的位置和目标位置。执行这些移动并截断缓冲。不要复制第一个不需要的元素之前的任何元素。

你可能感兴趣的:(Scala笔记)