LeetCoda--650:只有两个键的键盘

本文探讨了在记事本中通过CopyAll和Paste操作生成特定数量字符'A'的最少步骤问题。给出了针对素数和非素数目标数量的解决策略,并提供了两种不同算法实现,后者效率更高。

最初在一个记事本上只有一个字符 'A'。你每次可以对这个记事本进行两种操作:

  1. Copy All (复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的)。
  2. Paste (粘贴) : 你可以粘贴你上一次复制的字符。

给定一个数字 n 。你需要使用最少的操作次数,在记事本中打印出恰好 n 个 'A'。输出能够打印出 n 个 'A' 的最少操作次数。

示例 1:

输入: 3 输出: 3 解释: 最初, 我们只有一个字符 'A'。

         第 1 步, 我们使用 Copy All 操作。

         第 2 步, 我们使用 Paste 操作来获得 'AA'。

         第 3 步, 我们使用 Paste 操作来获得 'AAA'。

方法:按照题目描述不难推出:

           1个A == 0

           2个A == 2 

           3个A == 3

           4个A == 4

           5个A == 5

           6个A == 5

从上面的可以看出,当A的数量是素数时,需要n步

剩下的就好解决了,当A的数量不是素数时,直接使用动态规划,一个一个去试就可以了

class Solution:
    def minSteps(self, n: int) -> int:
        #定一个列表
        step = [i for i in range(n+1)]
        step[1] = 0
        if n == 1:
            return 0
        #减少for循环的数量
        if self.isSushu(n):
            return n
        else:
            for i in range(2, n+1):
                for j in range(1, i):
                    if i % j == 0:
                        step[i] = min(step[i], step[j] + i / j)
                        
        return int(step[n])
    
    #判断n是否为素数
    def isSushu(self, n):
        for i in range(2, int(n / 2) + 1):
            if n % i == 0:
                return False
        return True

这个方法耗时比较大,下面有个大佬写的,速度比上面的快10倍,借用一下

class Solution:
    def minSteps(self, n):
        if n == 2:
            return 2
        if n == 1:
            return 0
        if n > 2 and self.ifSushu(n):
            return n
        if n > 2 and self.ifSushu(n) == False:
            return self.minSteps(self.largestFactor(n)) + int((n / self.largestFactor(n)))
    
    def ifSushu(self, n):
        for i in range(2, int(n / 2) + 1):
            if n % i == 0:
                return False
        return True
    
    def largestFactor(self, n):
        count = int(n / 2)
        while count > 1:
            if n % count == 0:
                return count
            else:
                count -= 1

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值