自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(154)
  • 收藏
  • 关注

原创 redis对象编码源码阅读——有序集合编码和转码

redis对象编码源码阅读——有序集合编码和转码1. 有序集合对象的编码类型类型编码对象REDIS_ZSETREDIS_ENCODING_ZIPLIST使用压缩列表对象实现的有序集合对象REDIS_ZSETREDIS_ENCODING_SKIPLIST使用跳跃表和字典实现的有序集合对象2. 两种编码的转换void zsetConvert(robj *zobj, int encoding) { zset *zs; zskiplistNode *n

2020-12-06 15:52:40 262

原创 redis自顶向下源码阅读(十二)——读取 RDB 文件2

redis自顶向下源码阅读(十二)——读取 RDB 文件21. 读取value/* Read value */// if ((val = rdbLoadObject(type,&rdb)) == NULL) goto eoferr;/* Load a Redis object of the specified type from the specified file.* On success a newly allocated object is returned, otherwise

2020-12-05 21:48:33 312

原创 字节日常实习三面

游戏中台三面2020/12/3/15: 05(45分钟)问基本情况自我介绍实习经历做了什么东西遇到了什么困难学到了什么东西项目经历:描述项目有想过怎么改进吗redis数据结构说一下跳表跳表的效率集群相关(不知道)写个sql,在某段时间内0109-0111之间,每天的销售额最高的商品(group不熟,其他的写出来了,没写完)从n大小的数据中等概率取出m个数讲出了步骤,但是没记住证明过程(面试前看了这道题,但是偷懒没记证明)面试官:你

2020-12-03 21:41:14 1045 1

原创 字节日常实习二面

游戏中台二面2020/12/3/14: 00/一小时自我介绍自我介绍C++新特性介绍一下c++11新特性:lambda表达式、智能指针、类型转换、右值引用什么类型转换:static_cast, const_cast这些这些和强(制)转(换)有什么区别:封装了错误处理吧,具体的我也不太清楚了还有其他特性吗(提示:关键字):哦哦,还有类型推导那个。可以拼出来吗:de(**)type,中间两个字符不太记得了。。。那新的遍历方式知道吗:哦哦,auto,它可以直接推断出右边的类型它有哪些作用

2020-12-03 21:37:18 1150

原创 字节日常实习一面

字节游戏中台一面2020/12/1/14:00(一个小时)闲聊自我介绍:只说了学校实习时间上一段实习时间(两个月?)实习经历实习经历++++++++++++++++++++++++++++++++++++用的数据库,mysqlmysql你一般用的什么存储引擎:默认那个innodb事务的四种隔离性:未提交读提交读可重复读序列化序列化解决了什么问题:幻读什么是幻读用什么实现了可重复读:mvcc具体讲一讲mvcc版本链

2020-12-01 17:12:22 1121

原创 redis对象编码源码阅读——集合编码与转码

redis数据结构源码阅读——集合编码与转码1. 集合对象的编码类型类型编码对象REDIS_SETREDIS_ENCODING_INTSET使用整数集合实现的集合对象REDIS_SETREDIS_ENCODING_HT使用字典实现的集合对象2. 集合的转码过程/* Convert the set to specified encoding. The resulting dict (when converting * to a hash table) is p

2020-11-26 16:34:53 148

原创 redis自顶向下源码阅读(十一)——读取 RDB 文件1

redis自顶向下源码阅读(十一)——读取 RDB 文件11. 声明变量int rdbLoad(char *filename) { uint32_t dbid; int type, rdbver; redisDb *db = server.db+0; char buf[1024]; long long expiretime, now = mstime(); FILE *fp; // 专门用于 io 的数据结构 rio rdb; /

2020-11-17 22:55:13 331

原创 redis对象编码源码阅读——列表对象编码与创建

redis数据结构源码阅读——列表对象编码与创建1. 列表对象的编码类型类型编码对象REDIS_LISTREDIS_ENCODING_ZIPLIST使用压缩列表对象实现的列表对象REDIS_LISTREDIS_ENCODING_LINKEDLIST使用双端链表实现的列表对象摘自《Redis设计与实现》第63页2. 双端链表对象的创建robj *createListObject(void) { list *l = listCreate();

2020-11-17 21:48:40 123

原创 redis对象编码源码阅读——字符串编码过程

redis数据结构源码阅读——字符串编码过程对于RAW类型的字符串,需要进一步进行编码,判断它是不是可以表示为整型数;更进一步地,看它能否成为共享变量。当然这都是为了节约内存。/* Try to encode a string object in order to save space */robj *tryObjectEncoding(robj *o) { long value; sds s = o->ptr; size_t len;1. 判断是不是能编码

2020-11-17 00:41:23 372

原创 redis对象编码源码阅读——字符串编码与创建

redis数据结构源码阅读——字符串的创建1. 创建字符串对象在创建字符串对象的时候,有两种创建方式,一种是EMBSTR,一种是RAW.REDIS_ENCODING_EMBSTR_SIZE_LIMIT是一个比较小的值39。所以两者最大的区别就是长度。EMBSTR表示短字符串,RAW表示长字符串。robj *createStringObject(char *ptr, size_t len) { if (len <= REDIS_ENCODING_EMBSTR_SIZE_LIMIT)

2020-11-17 00:25:45 204

原创 redis自顶向下源码阅读(十)——加载 AOF 文件

redis自顶向下源码阅读(十)——读取 AOF 文件1. 检查 linux 中的内存设置 // #ifdef __linux__ // linuxMemoryWarnings(); // #endifvoid linuxMemoryWarnings(void) { if (linuxOvercommitMemoryValue() == 0) { redisLog(REDIS_WARNING,"WARNING overcommit_memory i

2020-11-10 21:50:14 261

原创 redis自顶向下源码阅读(九)——设置进程名

redis自顶向下源码阅读(九)——设置进程名1. 设置进程名把进程名设置成“argv[0] bindaddr[0]:port mode"的形式,便于ps查询和观看// redisSetProcTitle(argv[0]);void redisSetProcTitle(char *title) {#ifdef USE_SETPROCTITLE char *server_mode = ""; if (server.cluster_enabled) server_mode = " [

2020-11-10 14:14:14 236

原创 redis自顶向下源码阅读(八)——初始化监听

把第一个地址设为 0.0.0.0int listenToPort(int port, int *fds, int *count) { int j; /* Force binding of 0.0.0.0 if no bind address is specified, always * entering the loop if j == 0. */ // 如果没有指定绑定地址,则强制绑定为 0.0.0.0 if (server.bindaddr_count ==

2020-11-06 21:31:09 153

原创 redis自顶向下源码阅读(七)——服务器初始化

1. 信号量操作忽略两个信号量 signal(SIGHUP, SIG_IGN); signal(SIGPIPE, SIG_IGN);SIGHUP: hong up,挂断。本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。SIGPIPE: 对一个对端已经关闭的socket调用两次write, 第二次将会生成SIGPIPE信号, 该信号默认结束进程.SIG_IGN: 表示对前面的信号量参数进

2020-11-05 23:27:25 194

原创 redis自顶向下源码阅读(六)——守护进程启动

1. 进行与守护进程有关的预处理如果配置文件中要求已守护进程启动redis,则进行守护进程的一些预处理。摆脱父进程把 STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO重定位到"/dev/null"文件中。void daemonize(void) { int fd; if (fork() != 0) exit(0); /* parent exits */ setsid(); /* create a new session */

2020-11-05 15:58:05 98

原创 redis自顶向下源码阅读(五)——加载配置

redis自顶向下源码阅读(五)——加载配置1. 判断是不是查看version或help /* Handle special options --help and --version */ if (strcmp(argv[1], "-v") == 0 || strcmp(argv[1], "--version") == 0) version(); if (strcmp(argv[1], "--help") == 0 ||

2020-10-30 16:45:22 159

原创 redis自顶向下源码阅读(四)——哨兵设置

redis自顶向下源码阅读(四)——哨兵设置1. main 函数代码 /* We need to init sentinel right now as parsing the configuration file * in sentinel mode will have the effect of populating the sentinel * data structures with master nodes to monitor. */ /* 我们现在需要初始化

2020-10-30 16:44:01 103

原创 redis自顶向下源码阅读(三)——配置初始化

redis自顶向下源码阅读(三)——配置初始化initServerConfig()1. 设置服务器运行 IDgetRandomHexChars()用SHA1加密算法对ID进行加密,确保每个服务器的ID都不一样。即如果ID不同,那么它肯定是另一台服务器,或者是同一台机器重启了。void getRandomHexChars(char *p, unsigned int len) { char *charset = "0123456789abcdef"; unsigned int

2020-10-29 22:18:41 185

原创 redis自顶向下源码阅读(二)——服务器初始化

redis自顶向下源码阅读(一)——服务器初始化先放出主函数前面一段的代码int main(int argc, char **argv) { struct timeval tv; /* We need to initialize our libraries, and the server configuration. */#ifdef INIT_SETPROCTITLE_REPLACEMENT spt_init(argc, argv);#endif setlocal

2020-10-29 19:43:28 174

原创 redis自顶向下源码阅读(一)——序

redis自顶向下源码阅读(一)——序九月份回到学校,把《redis设计与实现》读完之后,觉得自己只是把理论知识泛泛地了解了一下,很多底层的实现(真正的代码部分)还是不够了解。所以,决定直接对源码进行阅读和博客记录。不知道需要花费多少时间哈哈。完成这部分计划就决定去面实习。gogogoredis版本redis3.0阅读的初步计划个人习惯喜欢从头到尾穿起来读,比较有连续性,所以采用自顶向下的阅读顺序,从主函数开始,一步一步地进入代码的逻辑。初步看了一下 redis.c 主函数,大概分为以下几个部分

2020-10-29 14:26:16 138

原创 google gflags命令行参数处理(c++)

google gflags介绍它可以直接从命令行中提取预定义好的参数。宏定义例子:// test.cpp#include <gflags/glags.h>// 三个参数:1.定义的参数名;2.默认值;3.提示语句DEFINE_string(query, "", "The keyword you need to query");DEFINE_uint64(search_type, 0, "It is the businessType. You can see the details

2020-07-24 11:42:36 302

原创 c++ Json文件处理

Json库Json::ValueJson::Reader()Json::Write()Json::Valuejson的数据类型,类似于map,但是不用指定key和value的类型。mentor说key不要为中文Json::Reader()常用函数parse(),使用方法如下// s为一个字符串格式的json数据;Json::Value json_data;// 这里把字符串直接转换为json格式Json::Reader().parse(s, json_data);// 然后就

2020-07-24 11:20:49 680

原创 腾讯日常实习(劳务实习)二面

2020.6.29 14:30-15:20(50分钟)目录2020.6.29 14:30-15:20(50分钟)编程题STL和C++虚函数操作系统计算机网络结束编程题一个树从根节点到叶节点表示一个数,比如1->2->3表示123。把所有的数加起来。很简单int ans;void dfs(Tree* root, int a){ if(!root) { ans += a; return; } dfs(root->left,

2020-06-29 23:26:00 875 2

原创 腾讯日常实习(劳务实习)一面(超详细!!)

6.28–14:30一面(耗时一个半小时)面试部门:微信搜一搜目录6.28--14:30一面(耗时一个半小时)面试部门:微信搜一搜两道算法题c++基础知识操作系统计算机网络STL算法(补)结尾两道算法题翻转列表//题目,实现下面这个函数struct LinkNode{ int value; LinkNode* next;}void reverse(LinkNode* head);题目不难,但是自己出现了很多小毛病,先放我当时写的代码#include <iostream&g

2020-06-29 22:59:42 3055 2

原创 leetcode:146. LRU缓存机制

146. LRU缓存机制思路一开始的思路是用map来保存每个key和pair<value,顺序>,顺序是用1,2,3…来表示的,越后面越表示没被访问。每当执行get和put的时候,访问的那个pair就移到1,它之前的页面就全往后移一位。这样也是能过简单的样例的,但是在最后几个样例会超时。因为它每次put和get都会把所有的map遍历一遍,非常耗时。所以就去看了题解,发现需要用到哈希表来解决搜索的问题,用双向列表来解决排列的问题。这方面详细的介绍就去看题解吧~ac代码class LRUC

2020-06-23 19:21:00 142

原创 leetcode:面试题 16.18. 模式匹配

面试题 16.18. 模式匹配思路把pattern中的a和b看成两个不同的字符串。字符串value看成x个a和y个b按照pattern的模式组合起来的字符串。把所有的这些可能算出来看能不能凑成value。先计算满足a*x+b*y=c的所有(x,y)对vp。c表示value的大小。然后对vp进行遍历,看能不能凑成value。测试的数据中,有各种特殊样例。例如:pattern或者value为空的情况;pattern中a或b的个数为0的情况。把这些情况都考虑进去就过了。class Solution {

2020-06-22 23:59:14 725

原创 GreedySnake:2020.6.19第三次更新及踩坑

参考:https://github.com/silence1772/GreedySnake个人github:https://github.com/okJiang/GreedySnake更新:实现了food.h类:随机生成一个food实现了snake吃food的操作,吃掉之后snake长度+1,并重新生成一个food实现了map.h类:一个简易的地图边框,正在用set实现蛇撞墙结束游戏的功能踩坑:构造/析构函数声明了必须要实现,大括号内为空也行。不对类成员元素造成改变的函数,最.

2020-06-20 01:31:10 336

原创 leetcode:1470. 重新排列数组

1470. 重新排列数组class Solution {public: vector<int> shuffle(vector<int>& nums, int n) { vector<int> v; for(int i = 0; i < n; i ++){ v.push_back(nums[i]); v.push_back(nums[i+n]); }

2020-06-18 21:49:57 138

原创 leetcode:1471. 数组中的 k 个最强值

1471. 数组中的 k 个最强值要想找到中位数,得先进行排序找到中位数之后,从左右两边一起往中间靠,满足条件的就push,直到k个class Solution {public: vector<int> getStrongest(vector<int>& arr, int k) { vector<int> ans; sort(arr.begin(), arr.end()); int num = a

2020-06-18 21:46:54 154

原创 leetcode:1472. 设计浏览器历史记录

1472. 设计浏览器历史记录题目你有一个只支持单个标签页的浏览器,最开始你浏览的网页是homepage,你可以访问其他的网站url,也可以在浏览历史中后退steps步或前进steps步。请你实现BrowserHistory类:BrowserHistory(string homepage) ,用homepage初始化浏览器类。void visit(string url)从当前页跳转访问url对应的页面。执行此操作会把浏览历史前进的记录全部删除。string back(int steps)在浏览

2020-06-18 21:43:12 219

原创 leetcode:503. 下一个更大元素 II

503. 下一个更大元素 II给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。示例 1:输入: [1,2,1]输出: [2,-1,2]解释: 第一个 1 的下一个更大的数是 2;数字 2 找不到下一个更大的数;第二个 1 的下一个最大的数需要循环搜索,结果也是 2。注意: 输入数组的长度不会超过 1

2020-06-18 21:30:19 164

原创 leetcode:445. 两数相加 II

445. 两数相加 II给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。进阶:如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。思路进阶的做法还没去做,下面的做法还是先翻转,再用两数相加的解法做的。/** * Definition for singly-linked list. * struct ListNode { *

2020-06-18 20:29:33 151

原创 leetcode:2. 两数相加

2. 两数相加给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。思路模拟一个加法器,设置一个进位符c,进位时为1,否则为0。然后从链表头开始,逐位相加,逢10进位就行了。当一个链表结束了,另一个链表还没加完,让剩下的链表和c相加。/** * Definition for singly-li

2020-06-18 20:28:07 129

原创 leetcode:215. 数组中的第K个最大元素

215. 数组中的第K个最大元素这里使用的是快速排序的思想,快排是每一次确定一个数的位置,左边的都比它小,右边的都比他大。但是直接用快排会需要更多的时间,这里相当于对快排进行剪枝,把快排中不需要的步骤去掉每次确定一个数的位置之后,如果第K个最大元素在左边,则只对左边进行搜索,否则对右边搜索当然,快排中的其他的优化也可以用在这里,比如取任意三个数中的中数来定位,或者是在搜索空间小于n=5时进行遍历,都可以。class Solution {public: int find(vector&lt

2020-06-18 15:27:42 91

原创 leetcode:41. 缺失的第一个正数

41. 缺失的第一个正数题目给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。提示:你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。解题思路这个题目增加了两个限制条件:时间复杂度为O(N),空间复杂度为O(1)。解法是比较巧妙的。假设,这个题目没有加时间复杂度的要求,那么我们只需要,对数组进行排序,然后遍历,很容易就能够求出未出现的最小整数。其实在这个过程中我们可以发现一个规律。那就是,在缺失的第一个正数之前,所有的数都是连续的,从1开始的(如果没有负数和零)。也

2020-06-18 13:52:11 82

原创 leetcode:208. 实现 Trie (前缀树)

208. 实现 Trie (前缀树)前缀树的思想:边表示字符(其实边和点都行)点的含义表示是否为单词结尾,也可另外再赋予其他含义insert过程先进行遍历,把前面所有的公共前缀遍历完然后在后面把剩下的字符加上最后end=true,表示这里是一个单词的结尾query过程先进行遍历,把前面所有的公共前缀遍历完遍历完公共前缀,这时候end=true,说明前面有这个字符串insert否则,没有struct node{ node(){ end = fa

2020-06-18 13:37:01 200

原创 leetcode:面试题 17.17. 多次搜索

面试题 17.17. 多次搜索完整的把字典树实现了一遍,不知道字典树的可以先去做实现Ties(前缀树)这道题解题思路是,把smalls数组建成字典树,然后再从big[0],big[1]...开始query,一旦搜索到了smalls中的字符串,就把big[i]中的iiipush到相应的ans数组中。smalls中的string映射到vector 的下标有很多种方法,这里直接用map存下来,后面再传给vector。class Trie{private: Trie* t[26]; bool

2020-06-18 13:02:22 380

原创 GreedySnake:2020.6.16 第二次更新及踩坑

贪吃蛇——C++练手> 参考:https://github.com/silence1772/GreedySnake> 个人github:https://github.com/okJiang/GreedySnake

2020-06-16 17:35:10 233

原创 GreedySnake:2020.6.15 第一次更新及踩坑

贪吃蛇——C++练手> 参考:https://github.com/silence1772/GreedySnake> 个人github:https://github.com/okJiang/GreedySnake

2020-06-16 17:29:46 225

原创 补:leetcode第 27 场双周赛,1460、1461、1462

补:leetcode第190次周赛,1460、1461、14621460. 通过翻转子数组使两个数组相等第一感觉,只要所有的数字相同,就可以翻转得到。证明略。。。class Solution {public: bool canBeEqual(vector<int>& target, vector<int>& arr) { if(target.size() != arr.size()) return false; sort

2020-06-05 21:56:04 198

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除