CodeWars再次挑战。今天我对此有疑问:
“您的任务是将给定尺寸n x m的巧克力棒切成小方块。每个方块的大小为1x1,并且不易碎。实现一个函数,该函数将返回最少的中断次数。
例如,如果为您提供大小为2 x 1的巧克力棒,则可以在一个中断中将其拆分为单个正方形,但是对于大小为3 x 1的巧克力棒,您必须进行两个中断。
如果输入数据无效,则应返回0(因为如果没有可分割的巧克力,则无需中断)。输入将始终是非负整数。”
由于某种原因,无论我提供的巧克力棒的哪一侧,输出始终为0。
我已经尝试过的:
object breakChocolate {
var result = 0
def breakChocolate(n: Int, m: Int) = {
var t = n*m
var i =0
def breaking(y:Int): Unit ={
if (t ==0 || t ==1)
result = i
else {
breaking(t%2)
i +=1
}
}
result
}
}
以下是测试:
测试结果: 测试用例 breakChocolate(5,5)应该返回24 测试失败
0不等于24 堆栈跟踪 38ms内完成 breakChocolate(7,4)应该返回27 测试失败
0不等于27 堆栈跟踪 1ms内完成 在76毫秒内完成
答案 0 :(得分:4)
要解决此问题,您根本不需要递归。考虑巧克力盘子的特殊情况:(1 x n)。要完全分割此板,您需要(n-1)个中断。现在您有盘子m x n。要将其分成m个形式(1 x n),需要中断(m-1)个。因此,总中断次数为
(m-1) + m*(n-1) ~
m - 1 + m*n - m ~
m*n - 1
答案 1 :(得分:3)
如果我正确阅读了Scala,则说明基本算法有误。
这实际上是一个非常简单的问题,类似于古老的难题:如果您有55个团队参加单淘汰赛,那么显然其中一些团队必须在第一轮比赛中告别,因此不会有一个完美的均匀括号。那么总共将玩几局?
答案:54.不管支架如何制作,它都是单淘汰赛。每场比赛将剩余球队减少一队。因此,要使55名参与者减少到一名获胜者,则必须玩54场比赛。
您的巧克力棒也有类似的说法。在某个时候,您面前有p
块巧克力。无论您选择打破哪一个,您都从堆中取出1
并放回2
,这意味着该堆现在有p + 1
件。因此,对于每个拆分,您都要添加一个片段。这应该直接导致答案...
...由于在某些情况下需要返回0
,这实际上可能是错误的,但是对这种情况进行特殊处理应该很容易。
答案 2 :(得分:0)
由于未运行breaking
,所以得到0。
如果要使用递归,一种选择可能是使用尾部递归函数。
检查第一个减量a
是否大于1,以获取“水平”中断次数以获取切片。循环时将1加到累加器。
然后通过递减b
来检查它是否大于1,以获取“垂直”中断的数量。这次添加起始的“水平”值,因为这实际上是您必须分割的次数。
object breakChocolate {
def breakChocolate(n: Int, m: Int): Int = {
def breaking(a: Int, b: Int, acc: Int = 0): Int = {
if (a > 1) breaking(a - 1, b, acc + 1)
else if (b > 1) breaking(a, b - 1, acc + n)
else acc
}
breaking(n, m)
}
}
答案 3 :(得分:0)
您可以改用以下代码:
function breakChocolate(n,m) {
if(n > 0 && m > 0) {
return n * m - 1;
} else {
return 0;
}
}