题目描述:
1、 输入M、N两个数,则按照以下规则形成一个数列;
2、 数列的前M个元素的值为1到M;
3、从M+1个元素开始,计算的逻辑为:
如果其前面的M个元素中,存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之如果其前面的M个元
素中,不存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之差;
请计算该数列第N个位置上的数值
补充说明
M取值范围:3<=M<=10
N取值范围:1<= N<=50
输入描述
两个整数,用逗号分割,分别表示M和N
输出描述
一个整数,表示数列第N个位置上的数值
示例1
输入
5,1
输出
1
package org.example;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class 计算数列位置N的值 {
public static void main() {
System.out.println(getResult(5,6));
}
public static int getResult(int M, int N) { // 初始化数列,前M个元素 List<Integer> sequence = new ArrayList<>(); for (int i = 1; i <= M; i++) { sequence.add(i); } // 如果N在M中,直接输出结果 if (N <= M) { return sequence.get(N - 1); } // 循环计算从第M+1个道第N个元素 for (int i = M; i < N; i++) { // 截取前面连续的M个元素 List<Integer> pre = sequence.subList(i - M, i); // 求最大值 int max = getMax(pre); // 求最小值 int min = getMin(pre); // 判断是否有重复元素 boolean hasDuplicate = hasDuplicate(pre); int currentNum; if (hasDuplicate) { currentNum = max + min; } else { currentNum = max - min; } sequence.add(currentNum); } return sequence.get(N-1); } private static boolean hasDuplicate(List<Integer> pre) { Set<Integer> set = new HashSet<>(pre); return set.size() == pre.size(); } private static int getMin(List<Integer> pre) { int min = Integer.MAX_VALUE; for (Integer i : pre) { min = Math.min(min, i); } return min; } private static int getMax(List<Integer> pre) { int max = 0; for (Integer i : pre) { max = Math.max(i, max); } return max; }}