题目描述
哈希表常见的三个操作时put、get和containsKey,而且这三个操作的时间复杂度为O(1)。现在想加一个setAll功能,就是把所有记录value都设成统一的值。请设计并实现这种有setAll功能的哈希表,并且put、get、containsKey和setAll四个操作的时间复杂度都为O(1)。
[友情提示]: C++选手若有需要可以使用unordered_map替换map来将复杂度从O(log n)降为O(1)
输入描述:
第一行一个整数N表示操作数。
接下来N行,每行第一个数字opt代表操作类型
若opt=1,接下来有两个整数x, y表示设置key=x对应的value=y
若opt=2,接下来一个整数x,表示查询key=x对应的value,若key=x不存在输出-1
若opt=3,接下来一个整数x,表示把加入过的所有的key对应的value都设置为x
输出描述:
对于每个操作2,输出一个整数表示答案
示例1
输入
6
1 1 2
2 1
2 2
3 4
2 1
2 2
输出
2
-1
4
-1
解法一:设置一个time位记录插入时间
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int nums = Integer.parseInt(br.readLine());
fun(nums,br);
}
public static void fun(int nums,BufferedReader br) throws Exception{
MyHashMap map = new MyHashMap();
for(int i=0;i<nums;i++){
String[] info = br.readLine().trim().split(" ");
if("1".equals(info[0])){
int key = Integer.parseInt(info[1]);
int value = Integer.parseInt(info[2]);
map.put(key,value);
}else if("2".equals(info[0])){
int key = Integer.parseInt(info[1]);
int res = map.get(key);
System.out.println(res);
}else{
int value = Integer.parseInt(info[1]);
map.setall(value);
}
}
}
}
class Myvalue{
int value;
int time;
public Myvalue(int value,int time){
this.value = value;
this.time = time;
}
}
class MyHashMap{
HashMap<Integer,Myvalue> map;
int key;
Myvalue setAll;
int time;
public MyHashMap(){
map = new HashMap();
setAll = new Myvalue(0,-1);
time = 0;
}
public void put(int key,int value){
Myvalue mv = new Myvalue(value,time++);
map.put(key,mv);
}
public void setall(int value){
setAll = new Myvalue(value,time++);
}
public int get(int key){
if(map.containsKey(key)){
Myvalue value = map.get(key);
if(setAll.time>value.time){
return setAll.value;
}else{
return value.value;
}
}else{
return -1;
}
}
}