LeetCode 981.基于时间的键值存储(C++)
创建一个基于时间的键值存储类 TimeMap,它支持下面两个操作:
1. set(string key, string value, int timestamp)
- 存储键
key、值value,以及给定的时间戳timestamp。
2. get(string key, int timestamp)
- 返回先前调用
set(key, value, timestamp_prev)所存储的值,其中timestamp_prev <= timestamp。 - 如果有多个这样的值,则返回对应最大的
timestamp_prev的那个值。 - 如果没有值,则返回空字符串(
"")。
示例 1:
输入:inputs = ["TimeMap","set","get","get","set","get","get"], inputs = [[],["foo","bar",1],["foo",1],["foo",3],["foo","bar2",4],["foo",4],["foo",5]]
输出:[null,null,"bar","bar",null,"bar2","bar2"]
解释:
TimeMap kv;
kv.set("foo", "bar", 1); // 存储键 "foo" 和值 "bar" 以及时间戳 timestamp = 1
kv.get("foo", 1); // 输出 "bar"
kv.get("foo", 3); // 输出 "bar" 因为在时间戳 3 和时间戳 2 处没有对应 "foo" 的值,所以唯一的值位于时间戳 1 处(即 "bar")
kv.set("foo", "bar2", 4);
kv.get("foo", 4); // 输出 "bar2"
kv.get("foo", 5); // 输出 "bar2"
示例 2:
输入:inputs = ["TimeMap","set","set","get","get","get","get","get"], inputs = [[],["love","high",10],["love","low",20],["love",5],["love",10],["love",15],["love",20],["love",25]]
输出:[null,null,null,"","high","high","low","low"]
提示:
- 所有的键/值字符串都是小写的。
- 所有的键/值字符串长度都在
[1, 100]范围内。 - 所有
TimeMap.set操作中的时间戳timestamps都是严格递增的。 1 <= timestamp <= 10^7TimeMap.set和TimeMap.get函数在每个测试用例中将(组合)调用总计120000次。
#include <iostream>
#include <vector>
#include <tuple>
#include <string>
#include <numeric>
#include <map> using namespace std; //vector<tuple<string, string, int> > vec;
//auto iter = back_inserter(vec);
//vector<pair<string, map<string, int> > > vec;
//auto iter = back_inserter(vec);
//multimap<string, map<string, int> > mun; class TimeMap {
public:
TimeMap(){
ios_base::sync_with_stdio(false);
cin.tie();
} void set(string key, string value, int timestamp) {
mun[key].insert(map<int, string>::value_type(timestamp, value));//存储set()函数的参数值
} string get(string key, int timestamp) {
auto iter = mun[key].upper_bound(timestamp);
/*这里使用了二分法,并且这里必须使用upper_bound(),
因为题中有“如果有多个这样的值,则返回对应最大的timestamp_prev的那个值。”这个条件
iter的位置,恰好是最大值的下一个位置
*/
return iter == mun[key].end() ? prev(iter)->second : (iter == mun[key].begin() ? "" : prev(iter)->second);
/*这里也可以使用 return iter == mun[key].begin() ? "" : prev(iter)->second; 不过个人认为不好理解*/
/*使用上面这种方法:表示如果在map容器中没有找到不小于timestamp的值,表示map容器中的值都满足题目,
则我们只需要取前一位置的值。
如果找到了,则我们首先需要判断,找到的位置是不是在map的第一个位置,如果在,则表示map中的元素都不满足题目,则输出""
如果不在,表示iter前一位置的值是满足题目的。
*/
}
private:
map<string, map<int, string> > mun;//存储set()函数的map容器
};
int main()
{
TimeMap kv;
kv.set("foo", "bar", ); // 存储键 "foo" 和值 "bar" 以及时间戳 timestamp = 1
cout << kv.get("foo", ) << " "; // 输出 "bar"
cout << kv.get("foo", ) << " "; // 输出 "bar" 因为在时间戳 3 和时间戳 2 处没有对应 "foo" 的值,所以唯一的值位于时间戳 1 处(即 "bar")
kv.set("foo", "bar2", );
cout << kv.get("foo", ) << " "; // 输出 "bar2"
cout << kv.get("foo", ) << " "; // 输出 "bar2" system("PAUSE");
return ;
}
LeetCode 981.基于时间的键值存储(C++)的更多相关文章
- [Swift]LeetCode981. 基于时间的键值存储 | Time Based Key-Value Store
Create a timebased key-value store class TimeMap, that supports two operations. 1. set(string key, s ...
- 【插件开发】—— 8 IPreferenceStore,插件的键/值存储!
前文回顾: 1 插件学习篇 2 简单的建立插件工程以及模型文件分析 3 利用扩展点,开发透视图 4 SWT编程须知 5 SWT简单控件的使用与布局搭配 6 SWT复杂空间与布局搭配 7 SWT布局详解 ...
- 用于C# 的异步,持久的键值存储 Akavache 使用
Akavache是一个异步的,持久的(即写入磁盘)键值存储,用于在C#中编写桌面和移动应用程序,基于SQLite3.Akavache非常适合存储重要数据(即用户设置)以及过期的缓存本地数据. 开源 ...
- SQLite实现内存键值存储
SQLite数据文件往Linux内存文件系统/dev/shm/data.sqlite3一放,就是内存级读写性能的SQL系统.用SQLite实现内存键值存储:CREATE TABLE IF NOT EX ...
- CockroachDB学习笔记——[译]CockroachDB中的SQL:映射表中数据到键值存储
CockroachDB学习笔记--[译]CockroachDB中的SQL:映射表中数据到键值存储 原文标题:SQL in CockroachDB: Mapping Table Data to Key- ...
- PowerDotNet平台化软件架构设计与实现系列(05):ETCD分布式键值存储平台
ETCD目前在PowerDotNet已经被用于注册中心和配置管理(常见的配置中心在PowerDotNet中仅仅是一个小小的模块而已)中,作为基础设施的重要组成部分,ETCD的重要性不言而喻. 本文简单 ...
- Key-Value键值存储原理初识(NOSQL)
NO-Sql数据库:Not Only不仅仅是SQL 定义:非关系型数据库:NoSQL用于超大规模数据的存储.(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据).这些类型的数据存储不需要固 ...
- LeetCode 677. Map Sum Pairs 键值映射(C++/Java)
题目: Implement a MapSum class with insert, and sum methods. For the method insert, you'll be given a ...
- [iOS Keychain本地长期键值存储]
目前本地存储方式大致有:Sqlite,Coredata,NSUserdefaults.但他们都是在删除APP后就会被删除,如果长期使用存储,可以使用Keychain钥匙串来实现. CHKeychain ...
随机推荐
- jQuery+css实现tab功能
点击我我会消失 Click me 点击按钮我会消失,再点击我会出现 演示tab tab1 tab2 tab3 [环球时报记者 郭芳] “中国秘密发射新快速响应火箭”,25日,在中国官方媒体报道我国“快 ...
- SQLyog使用,连接ubuntu虚拟机(Error No.2003)
1.为mysql设置远程访问权限 mysql> grant all PRIVILEGES on *.* to ‘账号’@’%’ identified by ‘密码′; mysql> flu ...
- linux 定制
转载至http://luyafei.blog.51cto.com/1092421/1131532 测试环境: VMware Workstation 8.0 CentOS 6.7 x86_64 1.安装 ...
- AJAX使用四步曲
前言 AJAX这个东西还是很模糊的,下面会对AJAX这个技术进行详细讲解一些,另外,在网上商城中应用到了,使用它有四个步骤,下面详细介绍一些. 内容 定义: AJAX=异步JavaScript和XML ...
- U19464 山村游历(Wander) LCT维护子树大小
\(\color{#0066ff}{ 题目描述 }\) 在一个偏远的小镇上,有一些落后的山村.山村之间通过一些道路来连接.当然有的山村可能不连通. 一年当中会发生很多大事,比如说有人提议要在山村\(i ...
- BFS【bzoj1667】: [Usaco2006 Oct]Cows on Skates滑旱冰的奶牛
1667: [Usaco2006 Oct]Cows on Skates滑旱冰的奶牛 Description 经过跟Farmer John长达数年的谈判,奶牛们终于如愿以偿地得到了想要的旱冰鞋.农场上大 ...
- CF580D Kefa and Dishes 状压dp
When Kefa came to the restaurant and sat at a table, the waiter immediately brought him the menu. Th ...
- csv HTTP简单表服务器
HTTP Simple Table Server Download Performance testing with JMeter can be done with several JMeter in ...
- 【Groovy】Spock with Maven
已经在项目里使用Groovy/Spock做测试框架了,感觉和Maven结合在一起还是挺好用的. 在Maven的pom.xml里引入他们还是挺方便的,第一先要在dependency 里引入 <de ...
- Django 的 model form 组件
Django 的 model form 组件 Model Form 组件的由来 之前介绍过 Django 的 Form 组件(Django的Form表单)使用方法,Form 组件能够帮我们做三件事: ...