HelloCoder HelloCoder
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
  • 《可观测和监控》
随笔
关于作者
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
  • 《可观测和监控》
随笔
关于作者
  • 《LearnJavaToFindAJob》

    • 导读

    • 【初级】6~12k档

    • 【中级】12k-26k档

      • JVM进阶

      • Java进阶

      • MySQL

      • 中间件

      • 算法

        • 1-两数之和
        • 高频算法面试题
        • 2两数相加
        • 09-用两个栈实现一个队列
        • 11-盛水最多的容器
        • 19-删除链表的倒数第N个结点
        • 20-有效的括号
        • 22-括号生成
        • 39-组合总和
        • 46-全排列
        • 53-连续最大子序和
        • 64匹马,只有8个赛道,挑选出最快的4匹马
        • 70-爬楼梯
        • 136-只出现一次的数字
        • 141环形链表
        • 206-翻转链表
        • 234回文链表
        • 387-字符串中的第一个唯一字符
        • 543二叉树最大直径
        • 八大排序算法
        • 剪绳子
        • 旋转数
        • 模板
        • 求解立方根不使用库函数
      • 高阶

    • 【高级】26k+档

    • 大厂面试题

    • 求职建议

    • 面经

  • LearnJavaToFindAJob
  • 【中级】12k-26k档
  • 算法
#剪绳子
码农阿雨
2022-06-02
目录

剪绳子

据说这是一道快手的面试题。

# 描述:

原意:

给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),

每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问  可能的最大乘积是多少?

例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

人话:

拆解一个数,使其乘积最大

# 思路:

这是个数学问题。

如果你明白了这是个数学问题,你会发现这其实是道简单题目。

要拆解一个数,而且子集的和要原数一致,得到最大的乘积。

假如一个数小于等于 3,乘积应该是 n-1

假如一个数 4,乘积最大应该 是 2*2=4

假如一个数 5,乘积最大应该 是 3*2=6

假如一个数 6,乘积最大应该 是 3*3=9

假如一个数 7,乘积最大应该 是 3*2*2=12

规律:

倒序看一下,一个数拆解成3或者2,才会有最大的乘积。

如果最后剩下的差是 4,那么应该拆成 2*2,而不是 3*1

所以,这是一道贪心算法。

public class 快手剪绳子 {
    public static void main(String[] args) {
        System.out.println(cuttingRope(4));
        System.out.println(cuttingRope(6));
        System.out.println(cuttingRope(8));
        System.out.println(cuttingRope(9));
        System.out.println(cuttingRope(10));
        System.out.println(cuttingRope(11));
    }
    /**
     * 贪心算法   O(1)
     *
     * 当取 3 时,有最大乘积,否则取2。
     * 如果最后是4,那么应该拆成 2*2,而不是 3*1
     *
     * @param n
     * @return
     */
    public int cuttingRope3(int n) {
        if (n <= 3) {
            return n - 1;
        }
        //有多少个3
        int NumOf3 = n / 3;
        //判断最后是否是 4
        if (n - NumOf3 * 3 == 1) {
            //如果是4,应该拆成 2*2
            NumOf3--;
        }
        //有多少个2
        int NumOf2 = (n - NumOf3 * 3) / 2;
        return (int) Math.pow(3, NumOf3) * (int) Math.pow(2, NumOf2);
    }
}
阅读全文
×

(为防止恶意爬虫)
扫码或搜索:HelloCoder
发送:290992
即可永久解锁本站全部文章

解锁
#剪绳子
上次更新: 2026-03-28 17:00:16
最近更新
01
MySQL支持的锁有哪些
03-28
02
HTTP 是不保存状态的协议, 如何保存用户状态
03-28
03
用户态和内核态的区别
03-28
更多文章>
Theme by Vdoing | Copyright © 2020-2026 码农阿雨
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式