面试题之“路灯”

题目描述
									

V先生有一天工作到很晚,回家的时候要穿过一条长l的笔直的街道,这条街道上有n个路灯。假设这条街起点为0,终点为l,第i个路灯坐标为ai。路灯发光能力以正数d来衡量,其中d表示路灯能够照亮的街道上的点与路灯的最远距离,所有路灯发光能力相同。为了让V先生看清回家的路,路灯必须照亮整条街道,又为了节省电力希望找到最小的d是多少?

输入

输入两行数据,第一行是两个整数:路灯数目n (1≤n≤1000),街道长度l (1 ≤l≤109)。第二行有n个整数ai (0 ≤ ai≤ l),表示路灯坐标,多个路灯可以在同一个点,也可以安放在终点位置。

样例输入

7 15

15 5 3 7 9 14 0


输出

输出能够照亮整个街道的最小d,保留两位小数。

样例输出

2.50

import java.math.BigDecimal;
import java.util.Arrays;

/**
 * 题目描述
 * V先生有一天工作到很晚,回家的时候要穿过一条长l的笔直的街道,这条街道上有n个路灯。
 * 假设这条街起点为0,终点为l,第i个路灯坐标为ai。路灯发光能力以正数d来衡量,其中d表示路灯能够照亮的街道上的点与路灯的最远距离,
 * 所有路灯发光能力相同。为了让V先生看清回家的路,路灯必须照亮整条街道,又为了节省电力希望找到最小的d是多少?
 * 
 * 输入:
 * 【样例输入:7 15
 * 15 5 3 7 9 14 0】
 * 输入两行数据,第一行是两个整数:路灯数目n (1≤n≤1000),街道长度l (1 ≤l≤109)。
 * 第二行有n个整数ai (0 ≤ ai≤ l),表示路灯坐标,多个路灯可以在同一个点,也可以安放在终点位置。
 * 
 * 输出:
 * 【样例输出:2.50】
 * 输出能够照亮整个街道的最小d,保留两位小数。
 * @author xiaowei 2017年11月17日 上午9:22:34
 */
public class Streetlights {

    /*
     * 一开始看题目描述没看懂,因为不知道那些东西是确定的,后面看了输入输出,结合样例才确定看懂。
     * 题意:
     *      求指定数组中,任意两位数差的最大值的一半。
     */
    public static void main(String[] args) {
        Streetlights streetlights = new Streetlights();
        int[] a = { 15, 5, 3, 7, 9, 14, 0 };
        try {
            System.out.println(streetlights.getLightsRange(7, 15, a));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 计算半径d
     * @param n,路灯个数
     * @param l,街道长度
     * @param a,街道上路灯的位置
     * @throws Exception 
     */
    public float getLightsRange(int n, int l, int[] arr) throws Exception {

        // 不知道入参n意义何在,a的长度完全可以替代n
        if (arr == null || arr.length != n) {
            throw new Exception("参数输入有误!");
        }
     int[] a = Arrays.copyOf(arr, arr.length);
     // 升序
     Arrays.sort(a);
     int maxLen = 0;
        for (int i = 1; i < a.length; i++) {
            int tempLen = a[i] - a[i - 1];
            if (tempLen > maxLen) {
                maxLen = tempLen;
            }
        }
        // 计算街道开始到第一个路灯的距离,及最后一个路灯到街道末尾的距离
        int lastLen = l - a[a.length - 1];
        // 多个三目运算一起时,从右往左进行运算
        maxLen = a[0] > maxLen ? a[0] : lastLen > maxLen ? lastLen : maxLen;
        BigDecimal result = new BigDecimal(String.valueOf(maxLen));
        // 所求d为半径,故应除以2
        return result.divide(new BigDecimal(String.valueOf(2))).floatValue();
    }
}
输出结果:

2.5



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值