题解 | #剪绳子#

剪绳子

http://www.nowcoder.com/practice/57d85990ba5b440ab888fc72b0751bf8

这题比较偏数学思维了。观察几个数手动切割的结果可以发现,它们最大的乘积都是拆分成若干个2和3相乘得到的,不存在1,5,7。
根据这一结论可以将长度为n的数分为两部分,一部分由若干个3相乘得到,另一部分由若干个2相乘得到,且3必定多于2。
所以实际操作时,可以先找出3部分的乘积,在得出2部分的乘积。最后将两部分相乘即得结果。

具体实现为当n小于4时直接返回4 - 1,因2,3两种情况只能拆分成{1,1}和{1,2}。
然后计算计算n%3的值,当该值等于0时,说明n刚好被3整除,能拆分成n/3个3,此时最大乘积为3^(n/3)。当n%3等于1时,说明该数除3会余1,而我们不希望乘积中有1出现,这样相当于把这个1浪费了,所以我们将这个1与一个3组合成4,这样就得到了两个2,此时最大乘积为(3^((n-4)/3))*4。当n%3等于2时,此时最大成积为(3^(n/3))*2。不存在其他情况。

class Solution {
public:
    int cutRope(int number) {
        if(number < 4){
            return number - 1;
        }
        else{
            if(number % 3 == 0){
                 return pow(3, number / 3);
            }
            else if(number % 3 == 1){
                int more = number - 4;
                return 4 * pow(3, more / 3);
            }
            else{
                return pow(3, number / 3) * (number % 3);
            }
        }
    }
};
全部评论

相关推荐

昨天 22:35
门头沟学院 Java
点赞 评论 收藏
分享
秋招投简历提醒助手:个人经验是,一般面二十场左右就会进入侃侃而谈阶段。我今年七月末的时候开始的第一次面试,都是很多不会,回复很慢。后面慢慢迭代,到九月中的时候基本上面啥说啥,很放松的状态
远程面试的尴尬瞬间
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务