每天一到编程题——车站建造问题

题目描述

有10^8 个村庄排在一条公路上,依次编号为 0 ~ 10^8-1 ,相邻村庄距离为1,其中有n个村庄居住着牛牛,居住着牛牛的村庄从小到大依次为a0~an-1,其中保证a0=0.
现在需要建设车站,有两个要求必须被满足:
1、每个有牛牛居住的村庄必须修建车站。
2、相邻车站的距离必须为1或为某个质数。
现给出n和a数组,求需要建设车站的最小数量。

示例1
输入3,[0,7,11]
输出
4
说明
在0,7,8,11处建造车站,差值分别为7,1,3,符合要求

思路

本题求得车站个数建立最少的是
情况1 如果十分巧合的情况下有 牛的村庄 之间的间隔就是1或者是质数 那么结果就是 有牛的村庄的个数
情况2 如果 有牛的村庄 之间的差值 不符合 条件2 的话,那么就需要在这中间插入一个或者多个普通的村中来满足需求

  • 根据 哥德巴赫猜想 可以得到:任意一个大于2的整数都可以写成3个质数之和
  • 如果相差的是偶数的话 就可以找到两个 奇质数之和 所以就需要加 1个 车站
  • 如果相差的是奇数的话 最多需要加 2个车站 ,但是也有特殊情况 例如 19=2+17,15=2+13,21=2+19,这种情况就需要加1个就好了 这种情况都是 偶素数(质数也叫素数)+奇素数 ,所以就需要判断 这个奇数-2的结果是否是质数,如果是 就只加1个,如果不是就得需要加2个

代码

import java.util.*;


public class Solution {
    /**
     * 
     * @param n int整型 
     * @param a int整型一维数组 
     * @return int整型
     */
    public int work (int n, int[] a) {
        int count = n;
        for(int i = 1 ; i < n ; i++){
            int result = a[i]-a[i-1];
            if( result != 1 && !isPrime(result)){
                if( result % 2 == 0 || isPrime(result - 2) ){
                    count += 1;
                }else{
                    count += 2;
                }
            }
        }
        
        return count;
    }
    /**
    * 判断src是否是质数
    * @param src int 想要验证的数值
    */
    public static boolean isPrime(int src){
       double sqrt = Math.sqrt(src);
		if (src < 2) {
			return false;
		}
		if (src == 2 || src == 3) {
			return true;
		}
		if (src % 2 == 0) {// 先判断是否为偶数,若偶数就直接结束程序
			return false;
		}
		for (int i = 3; i <= sqrt; i+=2) {
			if (src % i == 0) {
				return false;
			}
		}
		return true;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值