• 一段练习的代码


    原本的例子是一个不算复杂的功能:删除数组中第一个负数之后的所有负数。

    比如:

    val a = scala.collection.mutable.ArrayBuffer[Int]()
    a += (23,44,67,55,39,7,-5,-17,-33,66,77,88,-12,-15,99,-46,-57,-70,90,-11,-26,-49,-55)
    想要得到结果:
    a = (23,44,67,55,39,7,-5,66,77,88,99,90)

    这个功能用一段比较简洁的代码就可以实现了。但是我非要自己给自己找别扭,想实现这样的结果:
    a = (23, 44, 67, 55, 39, 7, -5, 66, 77, 88, -12, 99, -46, 90, -11)
    于是就出现了下面这样一坨代码:
    import scala.util.control.Breaks

    object TrimArray3 {
    def main(args: Array[String]): Unit = {
    val a = scala.collection.mutable.ArrayBuffer[Int]()
    a += (23,44,67,55,39,7,-5,-17,-33,66,77,88,-12,-15,99,-46,-57,-70,90,-11,-26,-49,-55)

    var begIndx = 0
    var exit = 0
    Breaks.breakable(

    while (exit < a.length) {
    //第一个负数出现在第六个位置,下一次从第七个位置开始扫描,不再从0开始扫描。否则每次扫描到的begIndx都是6
    val indx = for(i <- begIndx until a.length if a(i) < 0) yield i

    //扫描到末尾了(后面没有负数了),跳出while循环,否则报错:下标越界
    if(indx == Nil) Breaks.break()

    println(indx)
    var sum = 0
    var tmp = indx(0)

    begIndx = tmp + 1

    //如果下标连续,说明是同一段连续的负数,计数得到这一段有几个负数,一起remove掉
    //设置一个标志,如果发现下标不连续了就不再做空循环了
    var flag = true
    for(j <- 1 until indx.length if flag){

    var tmp1 = indx(j)
    if (tmp + 1 == tmp1) {
    sum += 1
    tmp = tmp1

    } else {
    //发现下标不连续了,跳出循环
    flag = false
    }

    }
    a.remove(begIndx,sum)
    println(a)
    println(begIndx)
    exit += 1
    }

    )
    }
    }

    功能是实现了,但是“简洁”两个字就别提了。。。
    后面会想办法优化这段代码。欢迎大牛莅临指导,先在此谢过~
  • 相关阅读:
    kvm
    Javascript 笔记与总结(2-7)对象
    [Swift]LeetCode172. 阶乘后的零 | Factorial Trailing Zeroes
    Swift5.3 语言指南(五) 基本运算符
    C#6.0语言规范(一) 介绍
    [Swift]LeetCode171. Excel表列序号 | Excel Sheet Column Number
    [Swift]LeetCode169. 求众数 | Majority Element
    [Swift]LeetCode168. Excel表列名称 | Excel Sheet Column Title
    [Swift]LeetCode167. 两数之和 II
    [Java]LeetCode141. 环形链表 | Linked List Cycle
  • 原文地址:https://www.cnblogs.com/rabbit624/p/10538257.html
Copyright © 2020-2023  润新知