加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Codility TapeEquilibrium Scala

发布时间:2020-12-16 18:20:25 所属栏目:安全 来源:网络整理
导读:我使用 Scala编写了一个关于Codility的TapeEquilibrium问题的解决方案.我尝试了不同负载的大量测试输入,当我使用Codility Develipment环境和eclipse运行结果时,我得到了正确的答案.但是,当我提交结果时,几乎每次测试都会失败,并且错误的答案.我无法掌握确切
我使用 Scala编写了一个关于Codility的TapeEquilibrium问题的解决方案.我尝试了不同负载的大量测试输入,当我使用Codility Develipment环境和eclipse运行结果时,我得到了正确的答案.但是,当我提交结果时,几乎每次测试都会失败,并且错误的答案.我无法掌握确切的输入,但我已经使用随机数生成了类似大小的输入,这些输入始终有效.我已经查看了一段时间的逻辑,但无法弄清楚我做错了什么.有人能帮我吗.

测试可以找到here

这是我的代码

import org.scalacheck.Gen
import org.scalacheck._

object Problem1 extends App {

  def solution( A: Array[ Int ] ): Int = {
    var sumRight = A.foldLeft( 0 )( _ + _ )
    var sumLeft = 0;
    def absDiffer( a: Int,b: Int ) = if ( a < b ) b - a else a - b

    def minimizer( ar: List[ Int ],prevDiff: Int,sumL: Int,sumR: Int ): Int = {
      val diff = absDiffer( sumL,sumR )
      if ( diff <= prevDiff )
        minimizer( ar.tail,diff,ar.head + sumL,sumR - ar.head )
      else
        prevDiff
    }
    minimizer( A.toList,absDiffer( A.head,sumRight - A.head ),A.head,sumRight - A.head )
  }
  def randomInput( length: Int ) = {
    Gen.listOfN( length,Gen.oneOf( Range( -1000,1000 ) ) ).sample.get
  }
  def randomPosInput( length: Int ) = {
    Gen.listOfN( length,Gen.oneOf( Range( 1,100 ) ) ).sample.get
  }
  def randomNegInput( length: Int ) = {
    Gen.listOfN( length,-1 ) ) ).sample.get
  }

  val ar = randomPosInput( 100000 )
  val inputString = ar.mkString( "[",","]" )
  val clipboard = java.awt.Toolkit.getDefaultToolkit().getSystemClipboard()
  val sel = new java.awt.datatransfer.StringSelection( inputString )
  clipboard.setContents( sel,sel )
  println( inputString )
  println( solution( ar.toArray ) )
}

解决方法

我不是Scala开发人员,但我认为你过早地结束了你的递归 –

if ( diff <= prevDiff )
    minimizer( ar.tail,sumR - ar.head )
else
    prevDiff

我相信这应该是:

if ( diff <= prevDiff )
    minimizer( ar.tail,sumR - ar.head )
else
    minimizer( ar.tail,prevDiff,sumR - ar.head )

并且最后需要选择总体最小差异.

不确定这是否有帮助,但这是我在JS(100/100 on Codility)上一起入侵的解决方案:

function solution(A) {
    var total,forward,test,best;
    total = 0;
    for (var i = 0; i < A.length; i++) {
        total += A[i];
    }
    forward = A[0];
    best = Math.abs(total - 2*forward);
    for (i = 1; i < A.length-1; i++) {
        forward += A[i];
        test = Math.abs(total - 2*forward);
        if (test < best) {
            best = test;
        }
    }
    return best;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读