最初在一个记事本上只有一个字符 'A'。你每次可以对这个记事本进行两种操作:
Copy All(复制全部) : 你可以复制这个记事本中的所有字符(部分的复制是不允许的)。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

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

被折叠的 条评论
为什么被折叠?



