第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<n){
if(a(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(_))