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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |