这是一道百度校园招聘笔试题第二道(共五道题)
题目描述:
一个数轴上共有N个点,第一个点的坐标是度度熊现在位置,第N-1个点是度度熊的家。现在他需要依次的从0号坐标走到N-1号坐标。
但是除了0号坐标和N-1号坐标,他可以在其余的N-2个坐标中选出一个点,并直接将这个点忽略掉,问度度熊回家至少走多少距离?
输入描述:
输入一个正整数N, N <= 50。
接下来N个整数表示坐标,正数表示X轴的正方向,负数表示X轴的负方向。绝对值小于等于100
输出描述:
输出一个整数表示度度熊最少需要走的距离。
输入例子1:
4
1 4 -1 3
输出例子1:
4
------------------------------------------------------------------------------------------分界线--------------------------------------------------------------------------------------------
题目分析:
该题目的描述有点问题,需要理解清楚的是N个点的编号是按0到N-1来编号的,第一个点是0编号,度度熊的家是最后一个点,也就是编号为N-1的点。
题目的主要意思就是从0到N-1这N个点,一个一个挨住走一遍,但条件是把除开始点(编号为0)和结尾的点(度度熊的家即编号为N-1的点)外,剩下的点中删除一个点,再求回家的距离,要求是最短的距离。
解题思路:
先把总共需要走的距离求出来,然后再找出多走距离中最大的那个,然后减去它即可。
源代码如下:
import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt(); int minLength = 0; int[] a = new int[n]; for (int i = 0; i < n; i++) { a[i] = sc.nextInt(); minLength += Math.abs(a[i] - a[Math.max(i - 1, 0)]);// 整条路径距离; } //System.out.println(minLength); int surplus = 0; for (int i = 1; i < n - 1; i++) { // 如果当前点到中间点再到后一点距离之和大于当前点直接到后一点的距离,就是多走的路 int d = Math.abs(a[i - 1] - a[i]) + Math.abs(a[i] - a[i + 1]) - Math.abs(a[i - 1] - a[i + 1]); surplus = Math.max(surplus, d); // 找到这些多走的路中最大的一个距离 } //System.out.println(surplus); System.out.println(minLength - surplus); // 删除掉这个距离,就是度度熊回家至少走多少距离 } } }
运行结果为截图为:
PS:欢迎大家评论交流学习,如果大家有更好的思路可以分享出来一起学习!