14-
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1
示例 2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/jian-sheng-zi-lcof
思路:
1.首先想到暴力穷举,但考虑到切分的情况太多复杂度太高,放弃。
2.观察事例的例子,比较多的3和2(4=2*2),考虑到是否与2和3有关系。
3.搜了一下解答,果然还是太年轻。确实是与2和3有关系。将绳子长度对3取余,余数为1则切分成若干个3和一个4。余数为2则切分成若干个3和一个2。最后乘积为最大值。这里不实现这个方法。
4.另一个思路是,对于长度大于3的绳子,只对绳子切一刀,从第一个位置开始切,将绳子分为左右两段。当左边的最大值乘以右边的最大值最大时,即f(i)*f(n-i)最大时,返回结果。这需要知道f(n-1),f(n-2)······f(4)。f(3)到f(1)通过手动计算得出。
class Solution(object):
def cuttingRope(self, n):
"""
:type n: int
:rtype: int
"""
if n==2 :
return 1
if n==3:
return 2
li=[0]*(n+1)#初始化列表
for i in range(4):
li[i]=i#这里不是存的最大值,而是长度
for i in range(n+1)[4:]:
maxmodif=0
for j in range(n/2+1)[1:]:
modif=li[j]*li[i-j]
if modif>maxmodif:
maxmodif=modif
li[i]=maxmodif
return li[n]
15-
请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。
示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。
示例 2:
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 ‘1’。
示例 3:
输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 ‘1’。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof
本质为二进制转换。
class Solution(object):
def hammingWeight(self, n):
"""
:type n: int
:rtype: int
"""
count=0
while n!=0:
temp=n%2
if temp==1:
count=count+1
n=int(n/2)
return count
16-
实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof
思路:
1.先对x=1,n=1,n=0三种特殊情况进行判断
2.n>0使用乘(x*x),n<0使用除号(1/x)
3. 当n特别大的时候,使用for i in range(n)出现了内存溢出报错,因此选择采用递归的方法让n不断变小
class Solution(object):
def myPow(self, x, n):
"""
:type x: float
:type n: int
:rtype: float
"""
if n==0:
return 1
if n==1:
return x
if x==0:
return 0
temp=1.00000
if n>0:
if n%2==0:
return self.myPow(x*x,n//2)
elif n%2==1:
return self.myPow(x*x,n//2)*x
elif n<0:
if -n%2==0:
return self.myPow(1/(x*x),(-n)//2)
elif -n%2==1:
return self.myPow(1/(x*x),(-n)//2)/x
return temp
17-
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
示例 1:
输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof
class Solution(object):
def printNumbers(self, n):
"""
:type n: int
:rtype: List[int]
"""
temp=1
for i in range(n):
temp=temp*10
li=[]
for i in range(temp)[1:]:
li.append(i)
return li