实现一个简易的HashMap
实现一个键的类型为int,值的类型为int的HashMap
输入一个T,表示操作次数;
之后每行接一个操作,可以包括插入、删除、修改、查询、清空、判断是否有这个键;
因为是刚学完随手敲的,所以功能粗糙。插入不考虑键已经存在的情况。删除、修改、查询不考虑键不存在的情况;
#include "bits/stdc++.h"
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
// 因为int的数据范围为1 << 32 个数。所以把哈希表开到1 << 16从内存和效率上讲比较折中
const int SIZE = << ;
struct Map {
int key;
int value;
Map* next;
}*hashtable[SIZE];
int hashCode(int k) {
int code = k % SIZE;
return code < ? -code : code;
}
Map* init(int k, int v, Map* next) {
Map* point = (Map*)malloc(sizeof(Map));
point->key = k;
point->value = v;
point->next = next;
return point;
}
void insert(int k, int v) {
int id = hashCode(k);
hashtable[id] = init(k, v, hashtable[id]);
}
void update(int k, int v) {
int id = hashCode(k);
Map* point = hashtable[id];
while (point != NULL) {
if (point->key == k) {
point->value = v;
return;
}
point = point->next;
}
}
int query(int k) {
int id = hashCode(k);
Map* point = hashtable[id];
while (point != NULL) {
if (point->key == k) {
return point->value;
}
point = point->next;
}
}
bool hasKey(int k) {
int id = hashCode(k);
Map* point = hashtable[id];
while (point != NULL) {
if (point->key == k) {
return true;
}
point = point->next;
}
return false;
}
void erase(int k) {
int id = hashCode(k);
Map* pre = hashtable[id];
if (pre == NULL){
return;
}
if (pre->key == k) {
hashtable[id] = NULL;
return;
}
Map* now = pre->next;
while (now != NULL) {
if (now->key == k) {
pre->next = now->next;
free(now);
return;
}
pre = now;
now = now->next;
}
}
void clear() {
for (int i = ; i < SIZE; i++) {
Map* point = hashtable[i];
Map* next;
while (point != NULL) {
next = point->next;
free(point);
point = next;
}
hashtable[i]=NULL;
}
}
int main() {
int T, k, v;
char op[];
scanf("%d", &T);
while (T--) {
scanf("%s", op);
if (strcmp("insert", op) == ) {
scanf("%d%d", &k, &v);
insert(k, v);
} else if (strcmp("update", op) == ) {
scanf("%d%d", &k, &v);
update(k, v);
} else if (strcmp("query", op) == ) {
scanf("%d", &k);
printf("%d\n", query(k));
} else if (strcmp("hasKey", op) == ) {
scanf("%d", &k);
puts(hasKey(k) ? "Yes" : "No");
} else if (strcmp("erase", op) == ) {
scanf("%d", &k);
erase(k);
} else if (strcmp("clear", op) == ) {
clear();
}
}
return ;
}
实现一个简易的HashMap的更多相关文章
- 手动实现一个简易版SpringMvc
版权声明:本篇博客大部分代码引用于公众号:java团长,我只是在作者基础上稍微修改一些内容,内容仅供学习与参考 前言:目前mvc框架经过大浪淘沙,由最初的struts1到struts2,到目前的主流框 ...
- .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”
FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...
- 自己来实现一个简易的OCR
来做个简易的字符识别 ,既然是简易的 那么我们就不能用任何的第三方库 .啥谷歌的 tesseract-ocr, opencv 之类的 那些玩意是叼 至少图像处理 机器视觉这类课题对我这种高中没毕业的人 ...
- 基于 getter 和 setter 撸一个简易的MVVM
Angular 和 Vue 在对Angular的学习中,了解到AngularJS 的两个主要缺点: 对于每一次界面时间,Ajax 或者 timeout,都会进行一个脏检查,而每一次脏检查又会在内部循环 ...
- 探秘Tomcat——一个简易的Servlet容器
即便再简陋的服务器也是服务器,今天就来循着书本的第二章来看看如何实现一个servlet容器. 背景知识 既然说到servlet容器这个名词,我们首先要了解它到底是什么. servlet 相比你或多或少 ...
- 使用Windows Form 制作一个简易资源管理器
自制一个简易资源管理器----TreeView控件 第一步.新建project,进行基本设置:(Set as StartUp Project:View/Toolbox/TreeView) 第二步.开始 ...
- [后端人员耍前端系列]AngularJs篇:使用AngularJs打造一个简易权限系统
一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJS来打造一个简易的权限管理系统.下面不多 ...
- ENode 2.0 - 第一个真实案例剖析-一个简易论坛(Forum)
前言 经过不断的坚持和努力,ENode 2.0的第一个真实案例终于出来了.这个案例是一个简易的论坛,开发这个论坛的初衷是为了验证用ENode框架来开发一个真实项目的可行性.目前这个论坛在UI上是使用了 ...
- 使用MVVM框架avalon.js实现一个简易日历
最近在做公司内部的运营管理系统,因为与日历密切相关,同时无需触发条件直接显示在页面上,所以针对这样的功能场景,我就用avalon快速实现了一个简易日历,毕竟也是第一次造日历这种轮子,所以这里记录下我当 ...
随机推荐
- 90.QuerySet API方法使用详解:distinct
distinct:去掉获取的数据中的重复数据,这个方法如果底层使用的数据库是mysql,那么就不能传递任何参数. (1)比如以下我们想要实现提取所有价格超过80元的图书,并且删掉那些重复的,那么可以使 ...
- C#-类型转换和引用转换
对象的引用可以被: 隐式地向上转换 显示的向下转换 向上转换 向上转换是指一个从一个基类指向一个子类: House house = new House(); Asset asset = house; ...
- Spring Cloud Alibaba 教程 | Nacos(五)
扩展配置(extended configurations) 通过之前的学习,我们知道应用引入nacos配置中心之后默认将会加载Data ID= ${prefix} - ${spring.profile ...
- atomic一定线程安全吗
atomic只是保证了操作的原子性,原子操作即一个操作不可再分. atomic只是对读写操作进行了加锁,保证了多线程开发时一个读写操作完成之后才能进行下一个读写操作 atomic和线程安全没有太大的关 ...
- python编程:从入门到实践----第五章:if语句>练习
5-1 条件测试 :编写一系列条件测试:将每个测试以及你对其结果的预测和实际结果都打印出来. a. 详细研究实际结果,直到你明白了它为何为True 或False b. 创建至少2个测试,且其中结果分别 ...
- 2×c列联表|多组比例简式|卡方检验|χ2检验与连续型资料假设检验
第四章 χ2检验 χ2检验与连续型资料假设检验的区别? 卡方检验的假设检验是什么? 理论值等于实际值 何条件下卡方检验的需要矫正?如何矫正? 卡方检验的自由度如何计算? Df=k-1而不是n-1 卡方 ...
- node 第三方库总结
app.post("/todo/add", (request, response) => { request.body //如何拿到前端ajax传来的JSON数据 }) 需要 ...
- 实践一次有趣的sql优化
课程表 #课程表 create table Course( c_id int PRIMARY KEY, name varchar(10) ) 增加 100 条数据 #增加课程表100条数据 DROP ...
- GO、 智能合约、cannot use transactionRecordId + strconv.Itoa(id) (type string) as type byte in append
1.报错详情 2.在写fabric go智能合约发送的错误,像我这样的新手就是踩坑踩坑踩坑 3.下面是代码片段 4.研究了一下append用法.也看了下GO语言官网文章: var test_str [ ...
- ZJNU 1153 - 找单词——中级
状态转移b[i]记录价值为i的单词种类数d[j+k*i]+=b[j] , k<=a[i]&&j+k*i<=50表示价值为j+k*i的单词可以由价值为j的单词加上k个i字母转 ...