题目描述:
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;
}
}