首页 > 试题广场 >

设计有setAll功能的哈希表

[编程题]设计有setAll功能的哈希表
  • 热度指数:1415 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
哈希表常见的三个操作时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

备注:

#include<iostream>
#include<string>
#include<unordered_map>

using namespace std;


class myValue{
    public:
      int value;
      int time;
      myValue(){};
      myValue(int m,int t):value(m),time(t){};
};

class myhash{
    private:
       myValue myv;
       int time ;
       unordered_map<string,myValue> hash;
     public:
       myhash(){
           this->time = 0;
           myValue temp(-1,-1);
           this->myv = temp;
       }
       void set(string key,int val){
              myValue myval;
              myval.value = val;
              myval.time = time;
              hash[key] = myval;
              time++;
              
        }
    
        bool contain(string key){
            if(hash.find(key)!=hash.end())
                return true;
            return false;
        }
 
    
        void set_all(int value){
            myv.value=value;
            myv.time=++time;
        }

        int get(string key){
            
            //表中存在该键值对
            if(hash.find(key)!=hash.end()){
                if(hash[key].time<myv.time){
                    return myv.value;
                }else{
                    return hash[key].value;
                }
            }else{
                return -1;
            }
        }
        
};

int main(){
  int N;
  cin>>N;
  int opt;
  myhash hash;
  for(int i=0;i<N;i++){
      cin>>opt;
      if(opt == 1){
         int x;
         int y;
         cin>>x>>y;
         hash.set(to_string(x),y);
         
      }
      if(opt == 2){
         int x;
         cin>>x;
         cout<<hash.get(to_string(x))<<endl;
      }
      if(opt == 3){
         int x;
         cin>>x;
         hash.set_all(x);
      }
  
  }
  return 0;
}
发表于 2020-05-24 19:54:28 回复(0)
#include <bits/stdc++.h>
using namespace std;

class {
    unordered_map<int, int> M, U;
    int all;
    public:
    void put(int x, int y){
        auto it = M.find(x);
        if(it != M.end())
            M.erase(it);
        U[x] = y;
    }
    int get(int x){
        if(M.find(x) != M.end())
            return all;
        if(U.find(x)==U.end())
            return -1;
        else
            return U[x];
    }
    void setAll(int x){
        for(auto it:U)
            M[it.first] = 0;
        U.clear();
        all = x;
    }
}P;

int main(){
    int n, opt, x, y;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>opt>>x;
        if(opt==1){
            cin>>y;
            P.put(x, y);
        }else if(opt==2){
            cout<<P.get(x)<<endl;
        }else if(opt==3){
            P.setAll(x);
        }
    }
    return 0;
}

发表于 2020-03-23 23:49:17 回复(0)
用一个set作为记忆,记录所有加入到哈希表中的key,用一个map进行正常操作,一旦遇到setAll操作就清空哈希表,记录当前的value。对于查询操作,有如下三种情况:
(1)如果遇到map中有当前的key,表示还没进行过setAll操作,直接返回对应的value;
(2)如果map中没有当前的key,而set中有这个key,表示已经进行过setAll操作,返回全局的value;
(3)如果set中也没有当前key,说明从来没有插入过这个键值对,返回-1即可。
import java.util.Scanner;
import java.util.HashMap;
import java.util.HashSet;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()) {
            HashMap<Integer, Integer> map = new HashMap<>();
            HashSet<Integer> memory = new HashSet<>();
            int allVal = 0;
            int n = sc.nextInt();
            for(int i = 0; i < n; i++){
                int op = sc.nextInt();
                if(op == 1){
                    int key = sc.nextInt();
                    int val = sc.nextInt();
                    map.put(key, val);
                    memory.add(key);
                }else if(op == 2){
                    int key = sc.nextInt();
                    if(map.containsKey(key))
                        System.out.println(map.get(key));
                    else if(memory.contains(key))
                        System.out.println(allVal);
                    else
                        System.out.println(-1);
                }else if(op == 3){
                    map.clear();
                    allVal = sc.nextInt();
                }
            }
        }
    }
}

发表于 2021-07-03 21:15:54 回复(0)
class MyHash:
    def __init__(self) -> None:
        self.map = {}
        self.memory = set()
        self.all_val = 0
    def put(self, key, val):
        self.map[key] = val
        self.memory.add(key)

    def get(self, key):
        if key in self.map:
            return self.map[key]
        elif key in self.memory:
            return self.all_val
        else:
            return -1
    def set_all(self, val):
        self.map.clear()
        self.all_val = val

def main():
    myhash = MyHash()
    N = int(input())
    for _ in range(N):
        tmp_list = list(map(int, input().split()))
        if tmp_list[0] == 1:
            myhash.put(tmp_list[1], tmp_list[2])
        elif tmp_list[0] == 2:
            print(myhash.get(tmp_list[1]))
        else:
            myhash.set_all(tmp_list[1])
main()
发表于 2022-05-08 13:10:36 回复(0)
#模拟题
#按照题目所说操作进行模拟
n=int(input())
hash_list=[]
for i in range(n):
    input_data=list(map(int,input().split()))
    if input_data[0]==1:
        hash_list.append([input_data[1],input_data[2]])
    if input_data[0]==2:
        flag=False
        for item in hash_list:
            if item[0]==input_data[1]:
                print(item[1])
                flag=True
                break
        if not flag:
            print(-1)
    if input_data[0]==3:
        for item in hash_list:
            item[1]=input_data[1]

发表于 2021-09-07 09:06:09 回复(0)
一个map,一个set配合即可。
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            Map<Integer,Integer> map=new HashMap<>();
            Set<Integer> set=new HashSet<>();
            StringBuilder sb=new StringBuilder();
            int allVal=0;
            int n=sc.nextInt();
            for(int i=0;i<n;i++){
                int op=sc.nextInt();
                if(op==1){
                    int key=sc.nextInt();
                    int val=sc.nextInt();
                    map.put(key,val);
                    set.add(key);
                }else if(op==2){
                    int key=sc.nextInt();
                    if(map.containsKey(key))
                        sb.append(map.get(key));
                    else if(set.contains(key))
                        sb.append(allVal);
                    else
                         sb.append(-1);
                    sb.append("\n");
                }else if(op==3){
                    map.clear();
                    allVal=sc.nextInt();
                }
            }
            System.out.println(sb.toString());
        }
        sc.close();
    }
    
}


发表于 2021-04-08 12:15:01 回复(0)
import java.util.*;
import java.io.*;
import java.io.*;
import java.util.*;
 
class newHash{
    private Map<String,myValue> hm;
    private long time;
    private myValue allv;
    public newHash(){
        hm = new HashMap();
        time = 0;
    }
    public void put(String key,String value){
        hm.put(key,new myValue(value,this.time++));
    }
    public String get(String key){
        myValue res = hm.get(key);
        if(res==null){
            return "-1";
        }else{
            if(allv!=null && allv.time>res.time){
                return allv.value;
            }else{
                return res.value;
            }
        }
    }
    public void setAll(String value){
        allv = new myValue(value,this.time++);
    }
}
 
class myValue{
    String value;
    long time;
    public myValue(String v,long t){
        this.value=v;
        this.time=t;
    }
}
 
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        newHash nh = new newHash();
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<N;i++){
            String[] s = br.readLine().split(" ");
            switch(s[0]){
                case "1":  nh.put(s[1],s[2]);break;
                case "2":  sb.append(nh.get(s[1])+"\n");break;
                case "3":  nh.setAll(s[1]);break;
            }
        }
        System.out.print(sb.toString());
    }
}

发表于 2021-03-05 09:18:44 回复(0)