自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 博客园地址

https://www.cnblogs.com/lijiayi123/

2021-11-03 15:25:20 121

原创 golang 切片传参

看懂这个代码首先要知道go语言的赋值都是“值语义”的,也就是所有赋值本质都是拷贝了一份副本,不存在传引用的情况。

2023-03-07 11:16:06 298 1

原创 springboot3.0 grpc服务器无法启动

不知道有没有人遇到过这个问题,Springboot3.0 grpc服务器就启动不了,2.4.5就能启动,全网都找不到原因…后来在grpc-spring-boot-starter 项目github评论区看到了这个。另外,springboot版本降下来后,mybatis和com.fasterxml.jackson.core都相继出现了问题,最后解决是前者降版本,后者删除版本改为自动匹配。所以如果是依赖grpc-spring-boot-starter启动rpc服务的,建议关注下依赖版本问题。

2023-02-24 14:35:59 957

原创 力扣 2290. 到达角落需要移除障碍物的最小数目

给定一个矩阵,0代表空地,1代表障碍物,要求移除最少的障碍物使可以从左上角走到右下角。

2023-02-16 11:40:48 521

原创 力扣 6357. 最少得分子序列

力扣6357.最少得分子序列 题解

2023-02-13 12:21:28 154

原创 力扣 1960. 两个回文子字符串长度的最大乘积

1960. 两个回文子字符串长度的最大乘积 题解

2023-02-10 14:37:44 110

原创 Codeforces Round #846 (Div. 2) B. GCD Partition

B.GCD Partition

2023-02-03 12:39:06 196

原创 TypeDB Forces 2023 (Div. 1 + Div. 2, Rated, Prizes!) C. Remove the Bracket

C. Remove the Bracket题解

2023-01-31 17:46:39 436 3

原创 51nod 1255 字典序最小的子序列(腾讯面试题)

原题链接同学面腾讯面到了,就来写一下。题意:给定一个串,要求找出字典序最小的子序列使原串中出现的每个字符都出现过一次思路:同学说用 o(n2)o(n^2)o(n2) 的时间复杂度写的,我想了一会也没想出这个复杂度该咋写。正解应该是贪心 o(n)o(n)o(n) 的写法,因为要求字典序最小,所以在往答案里面推入字符时发现答案末尾的字符比当前推入的字符大,那么就可以把这个字符删了,这样就能保住字典序是最小的。现在又要求每个字符要刚好出现一次,那么就是如果答案末尾的字符如果是该字母的最后一个就不能删。用栈模

2022-04-29 14:49:22 447 1

原创 Linux 五种IO模型

IO模型的意义:应对进程在运行过程中申请资源时产生的性能开销IO具体开销来源:对于一次IO访问,数据会先被操作系统内核的缓冲区,然后才会被拷贝到应用程序的地址空间,所以一个 read 操作会分为两个阶段:等待数据准备讲数据从内核拷贝到进程中常见的IO模型:阻塞、非阻塞、IO多路复用、异步,接下来一一介绍同步阻塞IO用户程序每次执行系统调用,进程就会进入阻塞,read的两个阶段过程中整个进程都是在阻塞中的,不能去处理别的IO,进程直接把CPU交出去了,只有数据准备完毕了,应用程序才会继续。对

2022-03-06 20:15:17 737

原创 Go语言 入门

配环境GoLand下载地址sdk地址然后激活码网上找找就可以了Hello WorldGo程序都是包形式的,头文件就是导入包,注意单文件编程包名必须是 mainpackage mainimport "fmt"func main() { fmt.Println("Hello World")导出名导入的包里的函数只有开头大写才是导出的,否则都是未导出的,所以注意大小写package mainimport "fmt"func main() { fmt.println("Hel

2022-03-06 15:48:51 316

原创 SQL9 2021年11月每天新用户的次日留存率

题目地址挺不错的一个题,把几个知识点都用到了,主要用到的知识点有count(*)overUNIONleft join用 UNION 将 in_time 和 out_time 看作同一列,顺便去重,count(*)over 判断新出现节点,left join 利用其不满足 on 条件就为 NULL 的性质找出次日留存的项。另外,With as 算是一个比较好的技巧,免得各种嵌套把自己整晕了。顺便附一个 left join 的博客With base as(select uid,dt,

2022-02-04 17:08:27 221

原创 堆排序模板

class Solution {public: void adjust(vector<int>&nums,int n,int k)//递归调整,每次跟子节点交换后再调整子节点 { int l=k*2+1; int r=k*2+2; int mxk=k; if(l<n&&nums[l]>nums[mxk]) { mxk=l;

2022-01-26 15:32:01 672

原创 C++ 关于不能将A** 转换为const A**的原因

在C++中,类似于const int *a=(int*)b这种非常量转化为常量是允许的,但是如果两边都再加一个星号就不允许了。 int *p; const int **a=&p;//报错为什么要这样设计呢?其实这是C++才加入的规则用来弥补之前的一个漏洞,这个漏洞就是这种双重常量指针可能会发生中间指针被篡改的事情,我们可以看下面这个代码 const int x=1; int *p; const int **a=&p; *a=&x; *p

2022-01-24 16:27:53 742

原创 C++ 关于函数形参中const的作用

在上 C++ 课的时候老师会要求一般类对象作为参数传递时要把形参写成 const 引用的形式,也就是这样的void fun(const string &a,const string &b){ }那么写成这样有什么好处?如果不这么写会怎样?我们先一个个来,讲一下引用的作用引用,其实就是给绑定的对象起了个别名,之后对这个别名的所有操作都可以看出对绑定对象的直接操作,那么当引用作为形参,函数调用时也可以看成将传递的实参绑定给它,这样我们在函数体内对这个引用做的一切操作都有可能影

2022-01-24 00:28:34 5712 4

原创 框选线段 (计算几何)

原题地址某厂笔试原题,编程题第一题直接给我整傻了,分类讨论半天最终也没ac,没练过计算几何的下场吧…题意:给定一个矩阵的坐标和两个点的坐标,要求这两个点连起来的线段被这个矩阵所截断的线段端点坐标。思路:利用向量解会非常方便,求出两点形成的向量,然后分别对横纵坐标求出偏移量,这样我们就可以很方便地得出线段两端点在任意延长线上的坐标。然后对两点分别进行讨论。比如,如果该点在矩阵右端点的右边,那么这个点射出去的线就有可能被矩阵右边线截取,所以可以根据偏移量求出这个点在线段延长线上,横坐标和矩阵右边线对齐的点

2022-01-20 13:26:31 383

原创 链表排序(归并)

利用归并的思想,每次找链表的中点,然后左右再分别递归,合并的时候由于两边都已经有序,所以双指针即可。要用到的知识点就是,归并排序,链表找中点,两个有序链表合并成一个。ListNode* Sort(ListNode* head,ListNode* tail) { ListNode* l=head; ListNode* r=head; if(l==nullptr) { return head; }

2022-01-15 22:20:24 927

原创 JZ4 二维数组中的查找

题目地址题意:给定二维数组和一个数,保证该二维数组横向和纵向都是严格递增,求其中有没有出现这个数。要求时间复杂度 O(n+m) ,空间复杂度 O(1)。思路:由于对于矩阵中的任何一个数,其右边的数都比它大,上面的数都比它小,所以我们从矩阵的左下角开始搜索,如果当前数大于给定的数,则往上走,小于就往右走,如果走出矩阵则表示没有。class Solution {public: bool Find(int target, vector<vector<int> > array

2022-01-12 23:18:00 192

原创 leetcode 334. 递增的三元子序列

题目地址题意:找三元组使其下标和数值都严格递增。要求时间复杂度 O(n) ,空间复杂度 O(1).思路:直接说做法,定义两个变量 first 和 second,要求初始化时 first < second 且 first对应的值所在位置在 second 左边。然后从 second 所在位置往后遍历,按以下策略更新遇到大于 second的数直接返回 true否则遇到小于 first 的数则更新 first否则遇到小于 second 的数则更新 second。第一个和第三个应该还是比较好理解

2022-01-12 22:54:02 269

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

题目地址题意:就是标题,返回第K大元素思路:最佳解法时间复杂度可以到O(n),所以我们来考虑下最佳解法。首先很容易想到的是可以用快排排序,然后直接下标取第 k 个数,这样复杂度是 O(logn) 。于是我们在这个的基础上深入,快排的底层就是每次选取一个数作为分界,然后通过交换令左边全是比它大(小)的,右边全是比它小(大)的,然后这个数的位置就被确定了,再递归地从这个位置左边和右边分别做上述事情。然而,这题我们只需要知道第 K 大,所以没有必要让整个数组有序,既然我们在每次递归的时候可以确定某个数的位置,

2022-01-11 23:04:45 82

原创 LeetCode 5979. 全部开花的最早一天

原题地址好久没写题了,现在贼拉胯…思路:每盆花种花时间是 a ,开花时间是 b ,显然不论如何排序,每盆花的种花时间都是连在一起的,那么要让总的时间最少,就要让开花时间尽量多的重叠,所以按开花时间从大到小排序,贪心的排。class Solution {public: int earliestFullBloom(vector<int>& a, vector<int>& b) { int n=(int)a.size(); v

2022-01-09 13:05:32 205

原创 快速排序 实现

基本思路是每次在序列中选择一个枢纽,并把这个序列分成左右两部分,左边都小于等于这个枢纽,右边都大于等于这个枢纽,然后再在左边分别排序。然而如果选的枢纽过于大或者过于小,那么对于一些比较有序的序列,这个算法的复杂度可能会掉到 O(n2)O(n^2)O(n2) ,所以这里我们选择这个序列中间,最左边,最右边的值的中间大小的那个作为枢纽。实操在数据量为十万级时基本可以秒出答案。#include <iostream>#include <vector>#include <arra

2022-01-07 21:24:45 550

原创 C++ 关于protected

这里不是要介绍protected,相关的访问权限学习了C++应该都会了解的。主要是想谈谈关于它的一条重要性质:派生类的成员或友元只能通过派生类对象来访问基类的受保护成员。派生类对于一个基类对象中的受保护成员没有任何访问特权不知道大家初学C++的时候有没有人跟我有一样的疑问,既然private是为了不让包括派生类在内的任何开发者,用户访问某个成员,public是为了完全放开某个成员,那么作为他们的中间产物protected,即派生类可以直接访问,而用户不能访问,真的能做到保护作用吗?比如我定义一个普通

2022-01-02 23:51:53 1749

原创 C++ lambda

相当于一个可以在函数内部定义的函数,主要用于可以把谓词当做参数的算法。格式如下:[捕获列表] (参数) {函数体}捕获列表中的是函数可能要用到的这个lambda所在函数中的局部变量,其它的跟普通函数差不多。捕获列表的作用主要是一般算法的谓词只接受一个参数或者两个参数,如果要用到不止这么多,就要用到捕获列表。另外如果在当前这个函数的外部的变量,就可以不用捕获列表,函数体内直接使用了。#include<iostream>#include<vector>#include<

2022-01-01 00:08:37 345

原创 C++ 顺序容器之emplace

C++中顺序容器一般都含有push_back,insert,push_front操作,这些操作的参数必然会包含容器相对应类型的对象或者迭代器。于是在某个版本后提供了与之相对性的emplace_back,emplace,emplace_front,不同是这几个方法的参数是容器对应类型的构造函数参数,当调用这个方法时,参数会被调到对应的类型的构造函数中,构造出对象不加入容器中,直接看代码可能直观点。#include<iostream>#include<vector>#include

2021-12-31 22:28:33 907

原创 C++ assign

赋值运算符要求左边和右边的运算对象既有相同的类型。它将右边运算对象中所有元素拷贝到左边运算对象中。顺序容器(array除外)还定义了一个名为 assign 的成员,允许我们从一个不用但相容的类型赋值,或者从容器的一个子序列赋值。意思就是我可以做类似于把list中的一段元素赋值给vector这样的操作。list<string>a;vector<const char *>b;a.assign(b.cbegin(),b.cend()); //const char*可以转换成st.

2021-12-30 23:37:57 1137

原创 C++ array

array是新C++标准增加的类型。与内置数组相比,array是一种更安全、更容易使用的数组类型。既然C++ Primer这么说了,那就学一下吧。array<int,42>p构造,规定数组元素类型和大小。array<int,42>p={1,2,3}初始化列表,前三个位置为相应数字,之后的是默认值。这里因为有默认值,所以如果构造类型是自定义的类,这个类就必须有默认构造才能这样初始化。相比普通的内置数组,这种数组支持拷贝操作array<int,10>q=p或.

2021-12-30 23:25:21 1417 1

原创 C++ 关于输入到文件结束

输入到文件结束应该是所有大学计算机刚学c语言时写oj一定会碰到的,那时候几乎会把以下几句死记硬背下来while(~scanf("%d",&a))while(scanf("%d",a)!=EOF)while(cin>>a)其中c++ 的这句while(cin>>a)到底是什么含义呢。直观上看就是到文件结束就返回一个0,否则非0.实际上cin是C++输入流的一个对象,而输入流是否运行正常,其本身是有一个状态的。为了表现这种状态,每个输入流对象都会有一个rdstate

2021-12-29 23:54:03 2392

原创 C++ 智能指针

详情请看以下三篇shared_ptrunique_ptrweak_ptr

2021-12-26 23:43:02 129

原创 C++ weak_ptr

weak_ptr是一种弱引用,即不会影响到指向对象的生存周期。通俗的讲,这个指针指向的都是shared_ptr所指向的对象,且不会对其计数器有改变,当shared_ptr被全部释放后,即使有weak_ptr指向该对象,这个对象也会自己释放。常用方法q.reset()将指针p空置p,use_count()返回计数器数p.expired()若p.use_count()为0,返回truep.lock()返回一个指向其对象的shared_ptr,如果没有对象,则返回

2021-12-26 23:40:40 236

原创 C++ unique_ptr

另一种智能指针,和shared_ptr不一样的是,它能独享所指向的对象,也就是如果有计数器,计数器的值必须小于等于1。常用方法u=nullptr释放u指向的对象,将u置为空u.release()u返回指针,并放弃对指针的控制权,置位空u.reset(q)u指向q对于unique_ptr的构造方法,C++ primer说没有提供类似于make_shared的方法,所以只能指向一个new返回的指针,但似乎在某个版本之后有了make_unique,我的看法是就用这个

2021-12-26 23:06:01 175

原创 C++ std::move

这个move其实跟移动没什么关系,只是在赋值的时候有移动的效果,其本身的作用是强行把左值变为右值,然后在赋值的时候因为变成了右值所以被当做临时资源给释放了,所以有移动的效果。左值就是有名字的变量,右值就是没有名字的临时变量,如"123",0.简单示例#include<iostream>#include<memory>#include<memory.h>using namespace std;string s = "123";int main(){ st

2021-12-24 22:28:54 487

原创 C++ shared_ptr

shared_ptr 其实就是对资源做引用计数——当引用计数为 0 的时候,自动释放资源。

2021-12-24 20:43:29 141

原创 C++ 手写 unordered_map 实现

insert(Key,Value)插入映射直接通过 [] 查询虽然写的是泛型,但暂时不知道非整形的类型要怎么获取hash数,回头学下#include<iostream>#include<string>using namespace std;#ifndef UNORDEREDMAP#define UNORDEREDMAPtemplate<typename Key, typename Value>class hashNode{public: Key k

2021-12-23 23:20:34 1103 1

原创 c++ 手写vector实现

主要实现功能:resize(n):容器大小改为nreserve(n):空间开辟大小改为npush_back(n):向数组末尾推入一个元素nsize():返回当前容器大小capcity():返回开辟空间大小front:返回第一个元素back:返回最后一个元素删除功能后序补以上所有功能涉及下标取值时如果超过size()大小会抛出异常。#include<iostream>using namespace std;#ifndef VECTOR_H#define VECTOR_H

2021-12-23 21:09:17 1428

原创 C++ explicit

主要用于类的构造函数限制其只允许显示构造,而不能隐式构造,所以只修饰单参构造,因为无参和多参构造本来就是显示的,所谓隐式构造可以看以下例子。#include<iostream>using namespace std;class Explicit{private: int val;public: Explicit(int x) :val(x) { cout << "int" << endl; } Explicit(const char* str)

2021-12-23 20:15:22 221

原创 The 2021 CCPC Weihai Onsite M - 810975(容斥)

写这题前,先把这道hdu6397经典题写了 。题意:给定n,m,k,要求个m个格子填数,使每个数在[0,n-1]范围内,且他们的和为k。思路:首先,不管[0,n-1]这个限制条件,考虑怎么用组合数算出方案。我是这样理解的,我们对选出的数取个前缀和,那么这m个数的前缀和必然在[0,k]这个区间内,且满足不递减,和最后一个数必然是k,由于最后一个数已经定了,那么问题变成选m-1个数,使他们不递减,且在[0,k]区间内,可以考虑插板法,对[1,k]的左边右边插板,插的每个板表示这个板要选择当前空隙的左边那个数

2021-11-25 17:04:45 1679 4

原创 hdu-5909 Tree Cutting(树形dp+FWT)

题目地址题意:求一棵树上子树异或和为[0,m)的个数各位多少。思路:f[i][j]表示以i为根异或和为j的连通子树的个数,转移就是f[i][j^k] = f[i][j^k]+f[i][j]*f[son][k].这是个异或卷积,用fwt优化,复杂度o(nmlogm)。这复杂度居然能过我也是没想到的#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#inc

2021-10-29 18:14:10 154

原创 2018 ICPC 徐州网络赛 D. Easy Math(莫比乌斯反演,杜教筛,记忆化搜索)

题目地址题意:给定n,m计算 ∑i=1mμ(i∗n)\sum_{i=1}^mμ(i*n)∑i=1m​μ(i∗n)思路:先推式子,显然μ(i*n)要不为0必须互质∑i=1mμ(i∗n)[gcd(i,n)==1]\sum_{i=1}^mμ(i*n)[gcd(i,n)==1]∑i=1m​μ(i∗n)[gcd(i,n)==1]由于莫比乌斯函数是不完全积性函数,互质的时候可以拆开∑i=1mμ(i)μ(n)[gcd(i,n)==1]\sum_{i=1}^mμ(i)μ(n)[gcd(i,n)==1]∑i=1m

2021-10-29 16:39:39 163

原创 D. Om Nom and Necklace(border树)

D. Om Nom and Necklace题意:给定一个n长的字符串和一个k。询问每个前缀是不是ABABABA这样的形式,其中B有k个,A有k+1个,AB都可以为空。思路:先说结论吧,既然AB都可以为空,那把AB看成一个串C那就是CCCC…A,A又是C的前缀,这显然是循环节,所以对于一个前缀,如果它存在这么一个循环节,其周期刚好是k,就是合法的。另外还有一种特殊情况,就是B为空,也就是A=C,那么就是刚好由K+1个一样的字符串组成也合法。那么怎么实现呢,我们知道循环节是根据kmp的border函数得来

2021-10-28 15:42:53 301

空空如也

空空如也

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

TA关注的人

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