自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 设计模式复习

常见的设计模式单例:只有一个实例,并向整个系统提供这一实例。工厂模式:观察者模式:装饰器模式单例模式里的多线程安全问题将构造函数设为private,这样只有通过其给出的静态方法来获得实例。饿汉式:懒汉式:C++11的实现:class Singleton{public:static T& getInstance() { static T instance; return instance;}//其余函数都为private...

2020-06-28 18:44:17 105

原创 leetcode随记备忘(13)

硬币这是一个完全背包问题,即每种物品都没有数量限制。这里贴一个背包问题讲解的链接背包问题这道题为了避免重复,正确的做法应该是先把25的硬币铺满,之后是10的硬币…即对于每一种硬币,都class Solution {private: static constexpr int mod = 1000000007; static constexpr int coins[4] = {25, 10, 5, 1};public: int waysToChange(int n) {

2020-06-24 17:11:35 83

原创 leetcode随记备忘(12)

二进制求和这道题思路和10进制求和差不多,先共同计算,然后再单独计算,并用一个carry表示进位。但是有所不同的是二进制的数的表示是下标大的在低位,所以下标控制上要注意。(其实完全可以把给定的两个字符串先reverse再操作,我蠢了)。最后结果也要reverse。代码如下:class Solution {public: string addBinary(string a, string b) { string res; int carry = 0;

2020-06-23 15:10:08 94

原创 leetcode随记备忘(11)

求和路径想法是先求树高,然后对树做一个遍历,对于每一个节点,用一个数组储存路径上的所有节点的值,每次对数组求和,如果恰好等于sum就将结果+1.在这个过程中,传入当前节点的高度。路径的数组只需要一个,它恰好会随着遍历的过程更新。代码如下:class Solution {public: int res = 0; int pathSum(TreeNode* root, int sum) { int high = get_high(root); vector

2020-06-19 21:51:53 118

原创 leetcode随记备忘(10)

最佳观光组合这一题一看就让人想到DP。当然本题的DP没有那么直接。我们用DP[i]来表示以i结尾的数对的情况下,取得最大值时另一个景点的坐标。这样就只要比较A[i-1]与A【DP[i-1]】减去位置差的大小,就可以得到DP[i]应该是哪一个数的坐标,具体原因不难想明白。然后可以进行一下优化,因为只需要用到DP【i-1】,所以可以把数组退化成变量,来将空间复杂度降至O(1).代码如下:注释里是DP数组。class Solution {public: int maxScoreSightseein

2020-06-18 17:30:39 98

原创 计算机网络复习(2)

一.post和get请求的区别get请求会把数据放在url后面,这样就暴露在地址栏中。而post会把包放在HTTP的包体中隐藏起来。get长度会受到url长度的限制,而post理论上不会。post安全性更高。get的用户信息很容易通过浏览器历史记录和缓存被窃取。其实也不一定。get只支持ASCII字符,而post无限制。post可能会修改服务器上的资源,比如点个赞。post会产生两个TCP包,先发送请求头,服务器回100,再发送请求数据。而get只发送一次,服务器回200.二.常见HTTP

2020-06-17 13:00:33 198

原创 leetcode随记备忘(9)

转变数组后最接近目标值的数组和这道题还是有一些难度的。想法是先排序,然后依次检查target-sum除以剩余数的数量所得到的值与当前数组值的大小关系。如果当前值更大,就说明需要考虑转换了。另外需要注意的是转换时需要四舍五入来找到最接近的值,但0.5应该舍而不是入。这一点很折磨人。代码如下:class Solution {public: int findBestValue(vector<int>& arr, int target) { sort(arr.be

2020-06-16 13:39:35 168

原创 C++随记备忘(3)

虚函数 vs 纯虚函数所谓虚函数(virtual),是定义在基类中且希望子类能够重写的函数,当子类重写虚函数后,子类对象会优先调用子类的方法,找不到再去找基类方法。而纯虚函数就是在基类中完全不写定义,强制子类重写它,否则就会报错。一个类,只要有纯虚函数就称为抽象类,一个抽象类只能作为基类,而且不能定义抽象类的对象,但是可以定义抽象类的指针,为的是,他可以指向派生类的对象实现多态。区别:对于虚函数来说,基类可以有定义,子类可以没有定义,也就是可以不重载。对于纯虚函数来说,基类必须无定义,子类必须有定

2020-06-14 23:48:12 92

原创 leetcode随记备忘(8)

把数字翻译成字符串一个经典DP问题,DP[i]与DP[i-1]和DP[i-2]有关,取决于i-1与i组成的数是否在10和25之间。代码如下:class Solution {public: int translateNum(int num) { if(num == 0) return 1; vector<int> p; while(num){ p.push_back(num%10); n

2020-06-11 10:13:04 89

原创 计算机网络复习(1)

这里记录一下最近复习计网所累积的知识点。1.OSI七层模型,TCP/IP四层模型以及五层协议三种常见的计算机网络结构描述。表示层:数据压缩,加密以及数据描述。使得计算机主机不需要考虑数据格式的不同。会话层:建立及管理会话。2.各层的常见协议数据链路层:将数据封装成帧。常用协议有CDMA/CD(载波监听多点接入/碰撞检测),PPP(主机与ISP通信所用的协议),MAC地址,交换机, 局域网,以太网(IEEE802.3)网络层:IP层。常用协议:IP, ARP(地址解析协议,IP到MAC地址的映

2020-06-09 22:47:03 141

原创 尝试腾讯云以及一些Linux设置

最近一直想有一个Linux环境来用,但是又不想在本来就容量有限的笔记本上装系统或者虚拟机。昨天夜里突发奇想:可以从腾讯云或者阿里云租一个服务器来用。然后就查了一下,发现腾讯云有学生折扣,一台2GB,1M带宽的小型服务器只需要10元/月,于是直接买了三个月。不得不说鹅厂这里还是很良心的。付款完成以后会收到一封站内信告知账号密码等基本信息。然后登陆云控制台就能找到一个实例,长这样:可以进行一些基本的关机重启等操作。之后有几种办法登陆shell.首先是腾讯云推荐的自制webshell,倒是很方便在浏览器就

2020-06-08 22:36:33 231

原创 leetcode随记备忘(7)

有序矩阵中的第K小元素这道题不是很容易想到做法。(当然可以用优先队列来维护数组中前K小元素,但是这样的复杂度为NNlogN。另外在这里记录一下:使用优先队列的时候,默认储存的是前K小的数,每次pop()出队列中最大的数,称为大顶堆。当比较函数写成greater时,此时为小顶堆,与大顶堆相反。)这里更好的想法是对于第K小元素的值做二分。这一点确实很难想到。取矩阵第一个和最后一个数取平均数mid,然后计算小于mid的数的数量,如果数量小于K,则提高下界,反之增加上界。这样最终当上下界相遇时就是第K小的数

2020-06-08 00:02:04 102

原创 leetcode随记备忘(6)

旋转链表这里要注意因为K可能大于链表长度,所以我们需要先遍历一次链表获得长度,然后取模。另外当K=0的时候逻辑不统一,需要特殊处理一下。剩下就是快慢指针的问题了。代码如下:class Solution {public: ListNode* rotateRight(ListNode* head, int k) { if(!head || !head->next || k == 0) return head; ListNode* p = head;

2020-06-06 18:31:46 90

原创 leetcode随记备忘(5)

数组中的第K个最大元素这道题第一次做的时候是用的k次冒泡排序,复杂度是O(nk).当K比较大的时候效率不好。所以考虑用快排里面的partition函数来做。因为每次parttion可以把数组分为大于P和小于P的两部分并返回P。这样通过比较P和K的值,可以进一步调整。这样的时间复杂度为O(NlogK),且不需要额外空间。另外利用优先队列来记录数组中的较大的K个数也是可以的,只是会额外占用空间。代码如下:class Solution {public: int partition(vector&lt

2020-06-04 16:42:32 102

原创 leetcode随记备忘(4)

反转整数问题并不难,但是在答案那里看到了很精彩的解法。贴一下别人的解法。相比之下我的按部就班做法就显得很蠢。class Solution {public: int reverse(int x) { int num=0; while(x!=0){ int pop=x%10; x/=10; if(num>INT_MAX/10 || (num==INT_MAX/10&&pop

2020-06-03 22:56:21 103

原创 C++随记备忘(2)

char str[]=”xunlei”;这里sizeof(str)=7,但是strlen(str)=6;这里str是字符数组,也就是字符串。2.判断机器是大端还是小端int checkCPU(){ { union w { int a; char b; } c; c.a = 1; return (c.b == 1); }}这里是由于union会将char也放到a的地址,也就是大端的话b就是1,小端的话B就是0.3.C++与C的区别设计思想上:C++是面向对象的语言,.

2020-06-02 22:25:38 122

原创 leetcode随记备忘(3)

除自身以外数组乘积这道题不能用除法,所以我们可以从后往前以及从前往后两次遍历。由于输出空间不算空间复杂度,所以可以先把正序的结果放进输出空间,在逆序的时候对应乘一下就行了,这样应该就算是O(1)的空间复杂度。代码如下:class Solution {public: vector<int> productExceptSelf(vector<int>& nums) { vector<int> res; int lengt

2020-06-02 16:31:19 104

原创 leetcode备忘(2)

寻找两个正序数组的中位数这道题其实很直观,因为有序数组的中位数就是中间的数,所以直接想办法把两个数组合并成一个有序数组就行了,用两个指针遍历,注意处理一下边界条件就可以AC。但是题目要求的时间复杂度是log,也就是要用二分的思路。这里我看了一下题解,做法是先算出需要排除的数的个数k,也就是(m+n) / 2,再分别取两个数组的k/2位置比较,这样每次可以排除k/2个数。其实就是找到合并数组的第k大的数的思路。我这里先贴上归并的做法:class Solution {public: double

2020-06-01 22:10:53 85

原创 C++随记备忘(1)

C++的复习其实前几天就开始了。这里先记录一下前面看过的一部分内容,后续继续补充,每天更新。复习主要通过nowcode,表示感谢。1.string后面的 ‘\0’, 在复制字符串的时候一定要注意。2.写一个strcpy。注意事项:a.源数组不能改动,需要加const。b.源地址和目的地址加非空断言。c.返回值应为目的地址。3.传入函数的参数应该是地址,二级指针!4.malloc后面应该跟着对于是否真正分配成功的检查以及free(p),同时最好将p = NULL,防止野指针。5.指针未初始定义

2020-06-01 13:39:14 178

原创 Leetcode随记备忘(1)

今天是儿童节,就把今天当作开始吧。先记录一下昨天做的一些题目。目前在做的是Top Interview Questions,medium collection 已经做完了,目前开始选做easy collection里的一些题目。另外也准备做一些中文leetcode那边的公司题。STRING TO INT这题很容易,当然有几个细节需要注意一下。1.将string中的数字部分push进vector里,随后判断vector的size不能大于10,这里会出现的问题是初始的0会影响size。所以需要再将头部

2020-06-01 10:40:41 131

空空如也

空空如也

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

TA关注的人

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