一、题目链接
http://noi.openjudge.cn/ch0106/07/
二、解题思路
⑴ 根据题意可知:将n个元素两两相邻做差的绝对值,可以得到n-1个非负整数,如果这n-1个非负整数恰好是
[1,n-1]范围中的每个数,则该序列存在有趣的跳跃,否则不存在有趣的跳跃,换句话说,n个元素两两相邻做
差的绝对值,正好使得[1,n-1]范围中的n-1个数每个数出现且仅出现1次;
⑵ 通过数组nums[n]存储n个元素,通过数组occur[n]标记[1,n-1]范围中的每个数出现的次数,如果[1,n-1]
范围中的一个数t出现,则令occur[t]++,显然,如果n个元素两两相邻做差的绝对值t不在[1,n-1]范围中,或
者n个元素两两相邻做差的绝对值t在[1,n-1]范围中但是occur[t] > 1(也即该值出现了至少2次),则nums数
组中一定不存在有趣的跳跃;
⑶ 显然,方法isJolly需要注入一个参数:int[] nums,存储指定的序列,方法isJolly的返回值为boolean,
true代表存在有趣的跳跃,false代表不存在有趣的跳跃。
三、程序代码
import java.util.Scanner;
public class Main {
public boolean isJolly(int[] nums) {
int n = nums.length;
int[] occur = new int[n];
int i;
int t;
for (i = 0; i < n - 1; i++) {
t = Math.abs(nums[i + 1] - nums[i]);
if (1 <= t && t <= n - 1) {
occur[t]++;
if (occur[t] > 1) {
return false;
}
}
else {
return false;
}
}
return true;
}
public static void main(String[] args) {
Main test = new Main();
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int[] nums = new int[n];
for (int i = 0; i < n; i++) {
nums[i] = input.nextInt();
}
System.out.print(test.isJolly(nums) ? "Jolly" : "Not jolly");
}
}