实现一个简易的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快速实现了一个简易日历,毕竟也是第一次造日历这种轮子,所以这里记录下我当 ...
随机推荐
- yum无法安装nginx,报错内容为1:nginx-1.14.2-1.el7_4.ngx.x86_64: [Errno 5] [Errno 2] 没有那个文件或目录
yum命令安装nginx时报错:1:nginx-1.14.2-1.el7_4.ngx.x86_64: [Errno 5] [Errno 2] 没有那个文件或目录 一.问题原因:Python版本的问题 ...
- 24.docker 部署 wordPress
1. 拉取远程 mysql 和 wordpress 镜像 并 启动起来 使用 docker pull mysql:5.7.27 docker pull wordpress 2. 创建mysql 的 c ...
- 剑指offer【08】- 二叉树的深度(java)
题目:二叉树的深度 考点:知识迁移能力 题目描述:输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 牛客网上的剑指offer题, ...
- EL表达式获取属性值的原理
EL表达式获取对象属性的原理是这样的:以表达式${user.name}为例EL表达式会根据name去User类里寻找这个name的get方法,此时会自动把name首字母大写并加上get前缀,一旦找到与 ...
- Cutting Sticks UVA - 10003(DP 仍有不明白的地方)
题意:对一根长为l的木棒进行切割,给出n个切割点,每次切割的价值,等于需要切割的木头长度. 一开始理解错了,认为切割点时根据当前木条的左端点往右推算. 实际上,左端点始终是不变的一直是0,右端点一直是 ...
- UML-领域模型-例子与总结
1.pos处理销售,示例 2.结论 1).每次迭代中,画概念模型只需要30分钟左右.避免瀑布思维. 2).在细化阶段开始构建概念模型
- ZJNU 2136 - 会长的正方形
对于n*m网格 取min(n,m)作为最大的正方形边长 则答案可以表示成 s=1~min(n,m) 对于一个s*s的正方形 用oblq数组储存有多少四个角都在这个正方形边上的正方形 以4*4为例 除了 ...
- mysql超大sql导入(10G)
mysql 大数据库文件上传(10G) phpstudy2017 环境 mysql 5.5.53 php 5.5.45 更改php.ini memory_limit 为 2048M php.i ...
- WOW.js 和 animate.css 使用
animate.css 动画样式,用户也可以非常容易修改设置喜欢的动画库. Wow.js 允许用户滚动页面的时候展示 CSS 动画.配合animate.css ,做出很棒的效果,它支持 animate ...
- 6)PHP,预定义变量
预定义变量也叫超全局变量: :预定义变量又叫超全局变量,包括: $_GET, $_POST, $_SERVER, $_REQUEST, $GLOBALS, $_COOKIE, $_SESSION, . ...