网易8月8号笔试题-第一道题

第一道题:数组素数拆分


第一组测试用例:[1,1,1],输出:0
第二组测试用例:[5,3,7],输出:6
思路:先找出数组中的最大值max,然后根据max求出max之前的所有素数放入到一个list中,然后再利用动态规划来做。
定义状态:dp[i]表示数字i能够拆分的最多的素数个数
状态转移:对list中所有小于i的素数j,有这样的转移公式dp[i]=Math.max(dp[i],dp[i-j])
初始化:dp[0]=0,dp[1]=0;
import java.util.*;
public class Main {
    public static void main(String[] args) {
        //设置两组测试用例
        int[] a1 = {3, 5, 7}; //期待输出是6
        int[] a={1,1,1}; //期待输出是0
        int max = 0;
        //找出最大值
        for (int i : a)
            max = Math.max(max, i);
        //找出所有的素数
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 2; i <= max; i++) {
            if (judgeSushu(i))
                list.add(i);
        }
        //这是一个动态规划
        int[] dp = new int[max + 1];
        dp[0] = 0;//这个是由其他转移过来的 dp[7-7]=dp[0]=1
        dp[1] = 0;
        //计算dp状态转移
        for (int i = 3; i <= max; i++)
        {
            for(int n:list)
            {
                if(n>i)
                    break;
                else
                    dp[i]=Math.max(dp[i],dp[i-n]+1);
            }
        }
        //统计数组中所有数的拆分成的最大素数个数
        int count=0;
        for(int i=0;i<a.length;i++)
            count+=dp[a[i]];
        System.out.println("总共有"+count+"个素数");
        
    }
    //判断一个数是否是素数
    public static boolean judgeSushu(int n)
    {
        for(int i=2;i<=Math.sqrt(n);i++)
            if(n%i==0)
            {
                return false;
            }
        return true;
    }


}










#笔试题目##网易#
全部评论
我看这题,全部分成2就可以了吧,不需要dp
点赞
送花
回复 分享
发布于 2020-08-08 20:11
我觉得直接最终分成2和3就行,1除外。那么奇数-1除以2就行,偶数就直接除以2.因为只有尽可能分成2和3才是最多的。(已ac)
点赞
送花
回复 分享
发布于 2020-08-08 20:26
秋招专场
校招火热招聘中
官网直投
除2就可以了。 def totalPrime(a):     total = 0     for num in a:         total += num//2     return total
点赞
送花
回复 分享
发布于 2020-08-08 22:01

相关推荐

2 1 评论
分享
牛客网
牛客企业服务