当前位置: 首页 > news >正文

O(1)时间复杂度实现有setAll功能的哈希表

在这里插入图片描述

代码逻辑

这道题的核心在于:

不直接修改所有数据,而是记录一个全局更新时间戳。

通过比较每个元素的更新时间和全局更新时间,动态判断应该返回哪个值。

1. put(k, v)
public static void put(int k, int v) {if (map.containsKey(k)) {// 键已存在,更新值和时间戳int[] value = map.get(k);value[0] = v;value[1] = cnt++;} else {// 新键,创建新的 [value, timestamp] 数组map.put(k, new int[]{v, cnt++});}
}

每次存值时,不仅存具体的value,还会记录当前的cnt(时间戳),然后cnt自增。

2. setAll(v)

public static void setAll(int v) {setAllValue = v;      // 记录全局值setAllTime = cnt++;   // 记录全局更新时间
}

记录了 “全局值”setAllValue和 “全局更新时间”setAllTime(同样用cnt作为时间戳,然后cnt自增)。

3. get(k)

public static int get(int k) {if (!map.containsKey(k)) {return -1;}int[] value = map.get(k);// 比较时间戳if (value[1] > setAllTime) {// 单个元素的更新时间晚于全局更新,返回元素自己的值return value[0];} else {// 单个元素的更新时间早于或等于全局更新,返回全局值return setAllValue;}
}

完整代码

public class SetAllHashMap {// 存储实际的键值对,值是一个数组 [value, timestamp]public static HashMap<Integer,int[]> map = new HashMap<>();// 全局设置的值public static int setAllValue;// 全局设置的时间戳public static int setAllTime;// 全局计数器,用于生成递增的时间戳public static int cnt;public static void put(int k, int v) {if (map.containsKey(k)) {// 键已存在,更新值和时间戳int[] value = map.get(k);value[0] = v;value[1] = cnt++;} else {// 新键,创建新的 [value, timestamp] 数组map.put(k, new int[]{v, cnt++});}}public static void setAll(int v) {setAllValue = v;      // 记录全局值setAllTime = cnt++;   // 记录全局更新时间}public static int get(int k) {if (!map.containsKey(k)) {return -1;}int[] value = map.get(k);// 比较时间戳if (value[1] > setAllTime) {// 单个元素的更新时间晚于全局更新,返回元素自己的值return value[0];} else {// 单个元素的更新时间早于或等于全局更新,返回全局值return setAllValue;}}public static int n,op,a,b;public static void main(String[] args)throws IOException{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));StreamTokenizer in = new StreamTokenizer(br);PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));while(in.nextToken()!=StreamTokenizer.TT_EOF){map.clear();setAllValue = 0;setAllTime  = -1;cnt = 0;n = (int) in.nval;for(int i=0;i<n;i++){in.nextToken();op = (int) in.nval;if(op==1){in.nextToken();a=(int)in.nval;in.nextToken();b = (int) in.nval;put(a,b);}else if(op==2){in.nextToken();a=(int)in.nval;out.println(get(a));}else{in.nextToken();a=(int)in.nval;setAll(a);}}}out.flush();out.close();br.close();}}
http://www.dtcms.com/a/509385.html

相关文章:

  • 南昌网站做ppt模板免费的网站推荐
  • 做网站网站庄家北京软件开发公司排
  • 做网站销售门窗怎么做网站建设细化流程
  • 足球梦网站建设的基本思路重庆有几个区
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段-二阶段(4):文法運用
  • 专门做相声的网站百度手机助手app下载官网
  • 邯郸网站关键字优化专科千万别学数字媒体应用技术
  • 网络攻防技术:假消息攻击
  • 刷赞网站推广软件企业网站建设的申请
  • 沈阳工伤保险做实在哪个网站婚礼策划网站建设
  • 企业网站建站wordpress登陆页面
  • 介绍好的免费网站模板下载广州海珠网站开发方案
  • 东莞专业网站建设平台长沙手机网站建设哪些内容
  • 工程施工行业在哪个网站容易找事做宿迁房产网签备案查询系统
  • 网站开发时如何设计英文版本做进口产品的网站
  • mie-散射-远场
  • 中山制作网站的公司怎么做俄语网站
  • 北京手机网站设计建设银行网站未响应
  • 玉溪网站开发网站关键词密度怎么计算的
  • 网站开发工程师获奖北京市朝阳区网站制作公司
  • 河北中瑞建设集团有限公司网站西安专用网站建设
  • 网站开发所需要的知识营销网站 深圳
  • 视频图像应用平台
  • 做图在哪个网站上找英国做电商网站
  • Java面试八股 CAP理论详解
  • 网站app免费制作软件网站改版需要多久
  • 江苏省品牌专业群建设专题网站零基础网站建设教学培训
  • 电商网站规划的开发背景wordpress 同步phpcms
  • 外贸网站怎么做seo品牌建设的定义
  • 商城模板网站主题及样式优化