

由题意可以得知这是一道暴力+模拟的题目,我们只需要根据题意说的模拟整个过程即可。首先需用循环接收n个数字,每次判断这个数字是否出现过,若没有出现则为对应的负值,若出现过则需要将这个坐标减去之前坐标的值再减一返回(因为计算的是两个之间的距离,需要在坐标基础上再减一),则需要两个对应的数据结构存储相应的值,为了使用方便我们用临时变量或者数组存放原数组,用ArrayList存放新数组,因为java里ArrayList自带了很多方法直接使用很便捷。
①接收数字n
②读入n个数字,用临时变量存储(也可以放进数组)
③读入后与使用集合的contains方法,若包含则算出距离放进arr数组,不包含则将这个数字的负值放进arr数组
④依次进行,直到n次循环结束
⑤输出结果
代码如下👇
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n=scan.nextInt();//数组容量
int arr[]=new int[n];//数组1存放结果
ArrayList<Integer> arrayList=new ArrayList<>();//数组2存放原数组中间状态
for (int i = 0; i < n; i++) {
int t=scan.nextInt();//临时变量
if (arrayList.contains(t)) {//在数组中寻找临时变量
arr[i]=arrayList.size()-arrayList.indexOf(t)-1;//计算距离
arrayList.remove((Object)(t));//删除多余的元素
arrayList.add(t);添加新值
}else {
arr[i]=-t;//负值
arrayList.add(t);//添加到数组2
}
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");//输出结果
}
scan.close();
}
测试用例:
5
1 2 2 1 2
-1 -2 0 1 1