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

it2022-05-05  193

第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(_))

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


最新回复(0)