leecode《剑指offer》-python

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

你可能感兴趣的:(leecode《剑指offer》-python)