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}2n1014
进阶:空间复杂度 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
 
 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 }

思路:遍历。

posted on 2022-03-25 15:25  阿ming  阅读(26)  评论(0)    收藏  举报

导航