【发布时间】:2019-07-01 11:06:14
【问题描述】:
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内完成 76ms 完成
【问题讨论】:
-
我不会对算法本身发表评论,但是您的代码将始终返回
0的原因非常简单:您定义了一个修改result的方法breaking,但你从来没有真正调用它。 -
有趣的问题。开始用笔和纸涂鸦,并注意到尺寸和所需切割数量之间的相关性。任何
2x2需要3 次切割,任何2x3需要5 次切割,任何3x3需要8 次切割,任何3x4需要11 次切割......注意到一个模式了吗? -
是的,这意味着切割的数量总是比所有碎片的总数小一倍。啊,好的,现在就知道了。我只是在想一个数学算法的衍生物,用数学语言来解释整个事情,但是是的,我确实明白了一般的想法:)
-
顺便说一句,抱歉回复晚了,正在度假:)