剑指offer---Day5

Posted Recently 祝祝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer---Day5相关的知识,希望对你有一定的参考价值。

Day5:剑指 Offer 14- I. 剪绳子

力扣链接:剑指 Offer 14- I. 剪绳子
题目:给你一根长度为 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。

题解:根据均等切割,可以得出需要让x1与x2尽量相等,尽可能相等时得到的数时最大的分析可以得出。n=2时,只能切成1X1,n=3时切成1X2。无论怎么分,不可能切成1,尽可能切分成2,3,4的数相乘,根据下边的公式2,和4是不能同时存在的,尽可能切成3可以得到更大的数,可以得到最大的乘积,根据余数可以判断是否需要把余数相加边变成4,若余数为1,就利用1 与前一个3相加变成4可以得到更大的乘积。

class Solution 
     public int cuttingRope(int n) 
        if(n<=2)
            return 1;
        
        if(n==3)
            return 2;
        
        int res = n/3;
        int mod = n%3;

        if(mod == 0)
            return (int)Math.pow(3,res);
        else if(mod ==1)
            return  (int)Math.pow(3,res-1)*4;
        else
            return  (int)Math.pow(3,res)*2;
        
    

Day5:剑指 Offer 14- II. 剪绳子 II

力扣链接:剑指 Offer 14- II. 剪绳子 II
题目:给你一根长度为 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。

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

题解:数值太大int类型可能会导致栈溢出,所以再获得乘积的时候需要转换为long类型,取余后转换为int类型,一个数与一个比自己大的数取余,无论取多少次余数都还是自己。

class Solution 
    public int cuttingRope(int n) 
        if(n<=2)
            return 1;
        
        if(n==3)
            return 2;
        

        int res = n/3;
        int mod =n%3;
        int p =1000000007;
        if(mod==0)
            return (int) (pow(3,res));
        else if(mod==1)
            return (int)(pow(3,res-1)*4%p);
        else
             return (int)(pow(3,res)*2%p);
        
        //多个数相乘的时候如何取余
    
      long pow(int a, int n)
        long res = 1;
        int p = 1000000007;
        for(int i= 1; i <= n; i++)
            res = (res * a) % p;
        

        return res;
    

Day5:剑指 Offer 15. 二进制中1的个数

力扣链接:剑指 Offer 15. 二进制中1的个数

题目:编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。

题解:java中& 与符号,二进制与比自己小1的数相与会进行进位,每次相与都能抵消掉一位1,直到n为0结束循环,就能得出有几位1;
也可以使用n与1相与,每次相与之后无符号又移一位,java无符号位移>>>
解1:

public class Solution 
    // you need to treat n as an unsigned value
	    public int hammingWeight(int n) 
	        int res=0;
	        while(n!=0)
	            n&=n-1;
	           res++; 
	    
	    return res;
	

解2:

public class Solution 
    // you need to treat n as an unsigned value
        public int hammingWeight(int n) 
            int res=0;
            while(n!=0)
            res+=n&1; 
            n>>>=1;
        
        return res;
    

Day5:剑指 Offer 16. 数值的整数次方

力扣链接:剑指 Offer 16. 数值的整数次方

题目:实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。

题解:减少遍历次数,减少运行时间,解析遍历n=13,就可以解析为1+4+8=13,变成三次遍历,重复使用前边的乘积

class Solution 
    public double myPow(double x, int n) 
        double res =1;
        long y=n;
        if(n<0)
            y=-y;
            x=1/x;
        
        while(y>0)
           if(y%2==1)
               res=res*x;
           
           x=x*x;
           y=y/2;
        
        return res;
    

end》》》
重要的不是被给予了什么,而是如何去利用被给予的东西。合理化利用资源。

以上是关于剑指offer---Day5的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer---Day5

剑指offer:剪绳子

剪绳子 --剑指offer

剑指offer:剪绳子

剑指offer——15剪绳子

剑指offer面试题 14. 剪绳子