题目描述:
给你一个待查数组 queries
,数组中的元素为 1
到 m
之间的正整数。 请你根据以下规则处理所有待查项 queries[i]
(从 i=0
到 i=queries.length-1
):
- 一开始,排列
P=[1,2,3,...,m]
。 - 对于当前的
i
,请你找出待查项queries[i]
在排列P
中的位置(下标从 0 开始),然后将其从原位置移动到排列P
的起始位置(即下标为 0 处)。注意,queries[i]
在P
中的位置就是queries[i]
的查询结果。
请你以数组形式返回待查数组 queries
的查询结果。
示例:
输入:queries = [3,1,2,1], m = 5 输出:[2,1,2,1] 解释:待查数组 queries 处理如下: 对于 i=0: queries[i]=3, P=[1,2,3,4,5], 3 在 P 中的位置是 2,接着我们把 3 移动到 P 的起始位置,得到 P=[3,1,2,4,5] 。 对于 i=1: queries[i]=1, P=[3,1,2,4,5], 1 在 P 中的位置是 1,接着我们把 1 移动到 P 的起始位置,得到 P=[1,3,2,4,5] 。 对于 i=2: queries[i]=2, P=[1,3,2,4,5], 2 在 P 中的位置是 2,接着我们把 2 移动到 P 的起始位置,得到 P=[2,1,3,4,5] 。 对于 i=3: queries[i]=1, P=[2,1,3,4,5], 1 在 P 中的位置是 1,接着我们把 1 移动到 P 的起始位置,得到 P=[1,2,3,4,5] 。 因此,返回的结果数组为 [2,1,2,1] 。
题目描述:
根据题目描述,由于数组P后面涉及到将数据提前,考虑到一般数组将数据提前操作耗费时间较长,所以开始时可以将数组P设计为一个LinkedList,类型为Integer,这样将数据提前操作比较简单,返回数据的下标也比较简单。
利用For循环遍历queries数组,当数组P中包含queries[i]时,将数组P中queries[i]值的下标返回给answer数组,同时将数据提前,之后继续循环。
最后返回answer数组。
java解法:
class Solution {
public int[] processQueries(int[] queries, int m) {
//生成链表P
LinkedList<Integer> LinkedList = new LinkedList<>();
int[] answer = new int[queries.length];
for(int i = 1; i <= m; i++){
LinkedList.add(i);
}
for(int i = 0; i < queries.length; i++){
if(LinkedList.contains(queries[i])){
//返回下标
answer[i] = LinkedList.indexOf(queries[i]);
//删除元素
LinkedList.remove((Integer)queries[i]);
//添加元素到链表头
LinkedList.addFirst(queries[i]);
}
}
return answer;//返回数组
}
}