Keep笔试第三题:
[[1,4],[2,5],[1,3],[0,4]]
第一个index是cmr;
第二个index是value;
现在构造一个双端队列
当
cmr = 1时向左添加元素value
cmr = 2时 向右添加元素value
cmr = 0 查询该元素value 距离左右边界最小值
最后输出所有当cmr = 0时得到的数组
例如:
[[1,4],[2,5],[1,3],[0,4]]
最后输出:[1]
因为:[3,4,5] 当执行 cmr = 0时 4 距离最左右边界最小值是1
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param queries int整型二维数组 操作列表
* @return int整型一维数组
*/
public int[] process (int[][] queries) {
List<Integer>result = new ArrayList<Integer>();
HashMap<Integer, Integer>map = new HashMap<Integer, Integer>();
int left = 0, right = 0;
for(int i = 0;i < queries.length;++i){
int cmr = queries[i][0];
int value = queries[i][1];
if(i == 0){
left = right = 0;
map.put(value, 0);
}else{
//向左添加元素记录最左边界
if(cmr == 1){
map.put(value, left--);
}
//向右添加元素
else if(cmr == 2){
map.put(value, right++);
}
//计算最小边界
else{
int queryValue = map.get(value);
int leftIndex = Math.abs(queryValue - left);
int leftIndex = Math.abs(queryValue - right);
result.add(Math.min(leftIndex, leftIndex));
}
}
}
int[] res = new int[result.size()];
for(int i = 0;i < result.length;i++){
res[i] = result.get(i);
}
return res;
}
}