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<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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值