OpenJudge-NOI-1.6.07-有趣的跳跃

一、题目链接

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 {

    /**
     * 返回指定的序列是否存在有趣的跳跃
     *
     * @param nums 整型数组,存储指定的序列
     * @return true,当且仅当nums中存在有趣的跳跃,否则false
     */
    public boolean isJolly(int[] nums) {
        int n = nums.length; // 序列长度
        int[] occur = new int[n]; // 标记1~n-1的值出现的次数,初始时均为0
        int i;
        int t; // 暂存nums两两元素差值的绝对值
        /* 依次计算nums两两元素差值的绝对值 */
        for (i = 0; i < n - 1; i++) {
            t = Math.abs(nums[i + 1] - nums[i]);
            if (1 <= t && t <= n - 1) { // 如果当前两两元素的差值的绝对值t在1~n-1之间
                occur[t]++; // 则该值出现的次数增加1次
                if (occur[t] > 1) { // 如果该值出现了不止1次
                    return false; // 则nums肯定不存在有趣的跳跃
                }
            }
            else { // 否则当前两两元素的差值的绝对值t不在1~n-1之间
                return false; // 则nums肯定不存在有趣的跳跃
            }
        }
        return true; // 以上均没有返回false,说明nums满足有趣的跳跃要求
    }

    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");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江苏科技大学_计算机学院_潘磊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值