java日记2018-04-30

第一题 剪绳子 把一根绳子剪成多段,并且使得每段的长度乘积最大。

参考算法 https://blog.csdn.net/qq_25827845/article/details/73351134

解题思路:

定义函数f(n)表示为把长度为n的绳子剪成若干段后各段长度乘积的最大值,对于第一刀,我们有n-1种可能的选择,可推导出f(n)=max{f(i)*f(n-i)};

当绳子的长度为2的时候,只能剪成长度为1的两段,所以f(2) = 1,当n = 3时,容易得出f(3) = 2;

当n>=4时,其实就是计算第i刀时,f(j)与f(n-i)的最大值

因为max(f(i)*f(n-i))与max(f(n-i)*f(i))显然会有重复运算,所以代码的j<=i/2

package com.lyc.dataautest;public class Maxcut {public static int maxcut(int n) {int result = 0;if(n<2) return 0;if(n==2) return 1;if(n==3) return 2;int[] f = new int[n+1]; for(int i=4;i<=n;i++) { int max=0;for(int j=1;jmax) {

max = res;

}

f[i] = max;

}

}

result = f[n];

return result;

}

}

第二题 二进制中 1 的个数

就是 位运算

n : 10110100

n-1    : 10110011

n&(n-1) : 10110000


public static int bit(int n) {

int count=0;

while(n!=0) {

n&=n-1;

count++;

}

return count;

}


第三题 数值的整数次方

解题思路:当指数是偶数时base^n = base^(n/2) * base^(n/2)  当指数是奇数时 base^n = base^(n/2) * base^(n/2) *base。注意n/2的值(3/2=1,4/2=2)才能了解上面的说明。判断是奇数还是偶数使用exponent%2取余。于是可递归计算。

public static double power(double base,int exponent) {

if(exponent==0) return 1;

double pow = power(base*base,exponent/2);

if(exponent%2!=0){

pow = base*pow;

}

return pow;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容