2022-3-25 剑指offer day42
题1:
JZ83 剪绳子(进阶版)
描述
给你一根长度为 n 的绳子,请把绳子剪成整数长的 m 段( m 、 n 都是整数, n > 1 并且 m > 1 , m <= n ),每段绳子的长度记为 k[1],...,k[m] 。请问 k[1]*k[2]*...*k[m] 可能的最大乘积是多少?例如,当绳子的长度是 8 时,我们把它剪成长度分别为 2、3、3 的三段,此时得到的最大乘积是 18 。
由于答案过大,请对 998244353 取模。
数据范围:2\leq n \leq 10^{14}2≤n≤1014
进阶:空间复杂度 O(1)O(1) , 时间复杂度 O(logn)O(logn)
1 import java.util.*; 2 3 4 public class Solution { 5 /** 6 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 7 * 8 * 9 * @param number long长整型 10 * @return long长整型 11 */ 12 static final int MOD=998244353; 13 public long cutRope (long number) { 14 // write code here 15 if (number==2) return 1; 16 if (number==3) return 2; 17 if (number%3==0) return pow(3,number/3)%MOD; 18 if (number%3==2) return 2*pow(3,(number-2)/3)%MOD; 19 else return pow(3,(number-4)/3)*4%MOD; 20 } 21 public long pow(long a,long n){ 22 long ans=1; 23 while (n>0) { 24 if (n%2==1) ans=(ans*a)%MOD; 25 a=(a*a)%MOD; 26 n=n/2; 27 } 28 return ans; 29 } 30 }
思路:学习一下快速幂的计算方法。
题2:
JZ17 打印从1到最大的n位数
描述
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。
1. 用返回一个整数列表来代替打印
2. n 为正整数,0 < n <= 5
2. n 为正整数,0 < n <= 5
1 import java.util.*; 2 3 4 public class Solution { 5 /** 6 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 7 * 8 * 9 * @param n int整型 最大位数 10 * @return int整型一维数组 11 */ 12 public int[] printNumbers (int n) { 13 // write code here 14 int len=(int)Math.pow(10,n)-1; 15 int[] ans=new int[len]; 16 for (int i=0;i<Math.pow(10,n)-1;i++){ 17 ans[i]=i+1; 18 } 19 return ans; 20 } 21 }
思路:遍历。
浙公网安备 33010602011771号