自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 暑期实习面经总结,愿offer++!

3.23 美团C++后端一面(挂了)数据库(一点不会,直接凉了)get和post区别cookie和session,适合什么场合redict和forward知道什么网络攻击(SYN),怎么预防SYN?三次握手,为什么不两次口述归并排序,空间复杂度链表有环,环的入口进程线程区别,线程同步方式死锁什么条件系统平均负载Linux下查看进程设计模式了解吗4.8 美团C++后端一面(捞起来面的)面向对象和面向过程封装 继承 多态final 关键字int double 各种类型占

2021-04-08 21:43:01 27

原创 C++面试题:手撕String类

对于一个String类要自己写构造析构,避免浅拷贝等内存泄漏问题class String{public: String(const char* str = nullptr); //普通构造函数 String(const String& other); //拷贝构造函数 String& operator=(const String& other); //拷贝赋值函数 ~String(); //析构函数private: char* m_dat

2021-04-07 13:34:57 18

原创 C++面试题:手撕单例模式

什么是单例模式单例模式指在整个系统生命周期里,保证一个类只能产生一个实例,确保该类的唯一性。单例模式可以分为懒汉式和饿汉式,两者之间的区别在于创建实例的时间不同:懒汉式 只有当需要使用该实例时,才会去创建并使用实例(这种方式要考虑线程安全)饿汉式 系统一运行,就初始化创建实例,当需要时,直接调用即可。(本身就线程安全,没有多线程的问题)懒汉式(线程不安全)class Singleton{private: Singleton(){}private: static Singl

2021-04-02 12:22:15 40 2

原创 C++面试题:手撕智能指针shared_ptr

template<class T>class SmartPtr{public: SmartPtr(T* ptr = NULL): _ptr(ptr), _pcount(new int(1)) {} SmartPtr(const SmartPtr& s): _ptr(s.ptr), _pcount(s._pcount){ *(_pcount)++; } SmartPtr<T>& operator=(const SmartPtr& s){ if

2021-03-28 23:23:21 63

原创 笔试相关:OJ在线编程常见输入输出练习(C++)

cin将数据存放到temp里面,并且进行好了类型转换,也就是说如果temp是int,那么输入的数据就会转化成int,如果是strin类型,那么就将输入的数据转换成string类型然后存入到temp里面,cin>>输入的数据不包含空格和回车,空格和回车会存入到cin的缓冲区中,如果想拿到输入的空格和回车,通过cin.get()获得。A+B(1)要求输入两个正整数,求两个数的和输入:1 510 20输出:6 30int main() { int a, b; wh

2021-03-20 15:08:55 77 1

原创 C++中判断字符的相关函数

C++中内置很多判断字符性质的函数,具体用法如下:isalnum() //是否是字母或者数字isalpha() //是否是字母isdigit() //是否是数字ispunct() //是否是标点符号isupper() //是否是大写字母islower() //是否是小写字母toupper() //转换为大写字母tolower() //转换为小写字母...

2021-03-08 16:02:52 62

原创 TCP协议和UDP协议头部结构

UDP协议源端口号,目的端口号:发送端和接收端的端口号长度:UDP用户数据报的长度,最小值是8字节(只有首部)校验和:检测UDP用户数据报在传输中是否出错,出错就丢弃源端口号,目的端口号:发送端和接收方的窗口号序列号:本报文段的数据第一个字节的序号确认号:期望收到的对方下一个报文段的第一个数据字节的序号首部长度:TCP报文段的数据起始处距离TCP报文段的起始处有多长,以4字节为计算单位保留:保留为今后使用,目前置为0紧急URG:此位置1,表明紧急指针字段有效,告诉系统此报文段有紧急数

2021-03-08 10:11:20 99

原创 HTTP协议常见问题总结

1 概念HTTP是Hyper Text Transfer Protocal(超文本传输协议)的缩写,用于万维网服务器传输超文本到本地浏览器的传送协议。HTTP不仅传送完成超文本跳转所必须的信息,而且也传送任何可以从互联网上得到的信息,包括声音,图像等。默认端口号为80(HTTPS是443)注意:HTTP本身是无连接的,使用面向连接的TCP作为传输协议HTTP是无状态的,无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增

2021-03-07 19:51:12 66

原创 剑指offer 40:最小的K个数

思路topK问题想到使用堆数据结构解决, 最小的K个数要维护一个大根堆,大根堆的元素有K个class Solution {public: vector<int> getLeastNumbers(vector<int>& arr, int k) { priority_queue<int> q; vector<int> res; if(k == 0) return res; f.

2021-03-03 13:27:36 15

原创 剑指offer 24:反转链表

方法一:定义pre节点和cur节点,记得将cur节点的next暂存,迭代的将节点一个一个反转。class Solution {public: ListNode* reverseList(ListNode* head) { if(!head || !head->next) return head; ListNode* pre = nullptr; ListNode* cur = head; while (cur) { .

2021-03-02 20:02:48 9

原创 剑指offer 53:0~n-1中缺失的数字

class Solution {public: int missingNumber(vector<int>& nums) { int l = 0, r = nums.size() - 1; while (l <= r) { int mid = (l+r) >> 1 ; if(nums[mid] == mid) l = mid + 1; else r = m.

2021-02-27 12:07:15 15

原创 剑指offer 53:在排序数组中查找数字

思路二次二分查找,查找target的右边界和target-1的右边界。target-1存在与否不影响边界的查找,可以理解成搜索插入位置。二者相减即为target出现的次数class Solution {public: int rightBound(vector<int>& nums, int target) { int l = 0, r = nums.size() - 1; while (l <= r) { i.

2021-02-27 11:34:20 10

原创 二分查找算法总结

本文参考《labuladong的算法小抄》二分查找适用于在一个排序数组中找到给定的数,遍历的复杂度为O(n), 二分的复杂度为O(logn),二分的场景有以下三种:寻找一个数寻找左侧边界寻找右侧边界!!关于搜索区间[left, right)和[left, right] !!开区间的话就像STL中的迭代器(指向最后一个元素的下一个元素),因此right=nums.size(), 对于mid的赋值同理,搜索过就要缩小区间(因此left向右移动要mid+1(左闭), right向左移动不用变(右

2021-02-27 11:07:52 39

原创 剑指offer 52:两个链表的第一个公共节点

两个链表互相走过对方的路,就相遇了A: a1->a2->c1->c2->c3->b1->b2->b3->c1B: b1->b2->b3->c1->c2->c3->a1->a2->c1如果不相交,两个链表也会相遇在NULLclass Solution {public: ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) .

2021-02-26 23:38:26 20

原创 剑指offer 54:二叉搜索树的第k大节点

思路二叉搜索树的中序遍历就是将所有节点从小到大排列,那么如果是从大到小排列,第k个节点就是第k大的节点了。因此在中序遍历的过程中只要先遍历右子树,后遍历左子树即可。class Solution {private: int count = 0, res = 0;public: void inorder(TreeNode* root, int k) { if (root == nullptr) return; inorder(root->right.

2021-02-25 23:37:27 12

原创 剑指offer 68:二叉搜索树的最近公共祖先

思路从上往下遍历,只要root在p,q之间就说明root是最近公共祖先。class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { while(root) { if (root->val > p->val && root->val > q->val) { .

2021-02-25 18:51:35 4

原创 剑指offer 68:二叉树的最近公共祖先

思路从两个叶子节点往父节点找,后序遍历很适合。注意递归逻辑中的四个逻辑判断。class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if (root == q || root == p || root == nullptr) return root; TreeNode* left = lowestCommonAncesto

2021-02-25 18:21:32 16

原创 剑指offer 55:平衡二叉树

思路核心思想就是在dfs的过程中维护一个全局变量来判断是否为平衡二叉树class Solution {private: bool balanced = true; int dfs(TreeNode* root) { if (root == nullptr) return 0; int left = dfs(root->left); int right = dfs(root->right); if (abs(r.

2021-02-25 16:15:48 5

原创 剑指offer 58:左旋转字符串

class Solution {public: string reverseLeftWords(string s, int n) { reverse(s.begin(), s.begin()+n); reverse(s.begin()+n, s.end()); reverse(s.begin(), s.end()); return s; }};

2021-02-25 15:57:38 7

原创 剑指offer 60:n个骰子的点数

class Solution {public: vector<double> dicesProbability(int n) { vector<double> res(n * 6 - n + 1); vector<vector<int> > dp(n + 1, vector<int>(6 * n + 1, 0)); // 将全部值初始化为 0 int row = dp.size(), co

2021-02-25 12:06:11 8

原创 剑指offer 61:扑克牌中的顺子

思路先将数组排序,遍历数组将0的个数记录下来,因为一个0可以补充一个数,举例:如果两个连续的数是5和8,就需要2个0来补充,如果0不够了直接返回false,如果能顺利的遍历完数组,证明抽出的扑克牌是顺子。class Solution {public: bool isStraight(vector<int>& nums) { sort(nums.begin(), nums.end()); int zero = 0; for (.

2021-02-25 00:23:33 8

原创 剑指offer 62:圆圈中最后剩下的数字

class Solution {public: int lastRemaining(int n, int m) { if (n == 1) return 0; return (m%n + lastRemaining(n-1, m)) % n; }};

2021-02-24 22:14:17 6

原创 剑指offer 63:股票的最大利润

思路与其说是动态规划,倒不如说是贪心。class Solution {public: int maxProfit(vector<int>& prices) { int res = 0; int minPrice = INT_MAX; for (int price : prices) { minPrice = min(minPrice, price); res = max(res.

2021-02-24 21:41:33 9

原创 剑指offer 64:求1+2+...+n

思路递归可以很好的解决问题但是递归一定要有出口,出口就要使用条件判断语句,与题目不符。可以使用&&运算符的特性:对于表达式a&&b,如果a不为假,那么不会运行b部分的代码,可以用来跳出递归class Solution {public: int sumNums(int n) { n && (n += sumNums(n - 1)); return n; }};...

2021-02-24 19:30:25 12

原创 剑指offer 65:不用加减乘除做加法

思路数的运算只有四则运算和位运算,题目不允许进行四则运算,只有通过位运算进行求解。无进位和 与 异或运算 规律相同,进位 和 与运算 规律相同(并需左移一位)先求异或,进位为与,进位加上异或值为最后的结果,迭代求出即可!C++中负数不能左移,注意转换成unsigned int!class Solution {public: int add(int a, int b) { int sum = 0, carry = 0; while(b) { .

2021-02-24 18:39:00 8

原创 剑指offer 66:构建乘积数组

思路使用二个dp数组分别维护i左侧的乘积和i右侧的乘积class Solution {public: vector<int> constructArr(vector<int>& a) { int n = a.size(); vector<int> res(n), dpl(n, 1), dpr(n, 1); for (int i = 1; i < n; ++i) { dpl.

2021-02-24 18:13:39 8

原创 剑指offer 57:和为s的两个数字

思路定义首指针和尾指针向中间遍历即可class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { int p1=0; int p2=nums.size()-1; while(p1!=p2) { if(nums[p1]+nums[p2]==target) return vector<int>.

2021-02-24 17:34:33 10

原创 剑指offer 34:二叉树中和为某一值的路径

class Solution {public: vector<vector<int>> res; vector<int> path; void dfs(TreeNode* root, vector<int> path, int targetSum) { if (root == nullptr) return; path.push_back(root->val); if (root.

2021-02-24 16:26:33 6

原创 剑指offer 55:二叉树的深度

思路DFS,二叉树的后序遍历,先求左子树最大深度,再求右子树最大深度,左右子树最大深度加一即为二叉树最大深度。class Solution {public: int maxDepth(TreeNode* root) { if (root == nullptr) return 0; return 1 + max(maxDepth(root->left), maxDepth(root->right)); }};...

2021-02-24 12:02:14 7

原创 剑指offer 50:第一个只出现一次的字符

思路遍历两次数组,第一次用hashtable存储出现次数,第二次找出value值为1的第一个数。对于字母类问题hashtable处理,使用数组作为hashtable其实效率更高。在这里我直接用hashtable了。class Solution {public: char firstUniqChar(string s) { unordered_map<char, int> map; for (auto c : s) { map.

2021-02-24 11:55:15 6

原创 剑指offer 44:数字序列中某一位的数字

代码来源于leetcode上的一个高亮题解class Solution {public: int findNthDigit(int n) { if(n == 0) {return 0;} int digit = 1; // 数位(个位/十位/百位/...,就是1/2/3/...) long start = 1; // 属于该数位的所有数的起始点数(个位是1,十位是10,百位是100) long index_count = dig.

2021-02-24 10:37:03 8

原创 剑指offer 32:从上到下打印二叉树 II

/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector<vector<int>&gt.

2021-02-23 23:56:30 4

原创 剑指offer 32:从上到下打印二叉树 I

思路二叉树的层序遍历。。。class Solution {public: vector<int> levelOrder(TreeNode* root) { queue<TreeNode*> que; vector<int> res; if (root != nullptr) que.push(root); while (!que.empty()) { TreeNode*.

2021-02-23 21:28:18 7

原创 剑指offer 39:数组中出现次数超过一半的数字

方法一:哈希表使用hashtable统计次数,返回超过数组长度一半的数字。class Solution {public: int majorityElement(vector<int>& nums) { unordered_map<int, int> count; for (auto n : nums) { count[n]++; } for (auto m : count.

2021-02-23 18:01:25 5

原创 STL中常见容器

vector:底层为数组,支持快速随机访问,能够实现动态扩容list:底层为双向链表,支持快速增删deque:底层为一个中央控制器和多个缓冲区,支持首尾快速增删,同时支持随机访问(像是list和vector的结合品)stack:一般用deque实现(不用vector:对stack的容量大小应该有限制),更准确的stack不能叫容器,是一种容器适配器queue:一般用deque实现,和stack一样,是一种容器适配器priority_queue:一般用vector实现,是一个堆(heap)数据结构.

2021-02-21 20:37:57 13

原创 用队列实现栈,用栈实现队列

本文包含的Leetcode题目用队列实现栈(Leetcode 225)用栈实现队列(Leetcode 232)Leetcode 225:用队列实现栈准备两个queue:q1, q2每次将元素先放入q2,然后将q1元素全部放入q2,再将q1和q2交换,这样能够保证每次最后进入的元素都在队列q1的最前端,实现栈逻辑。class MyStack {public: queue<int> queue1; queue<int> queue2; /**

2021-02-06 13:46:13 26

原创 栈数据结构总结(stack)

本文包含的Leetcode题目有效的括号(Leetcode20)逆波兰表达式求值(Leetcode150)删除字符串中所有相邻重复项(Leetcode1047)栈(stack)栈是一种先进后出的数据结构,在C++ STL默认使用deque(双向队列)进行实现(stack不算容器,算是一种容器适配器),STL中栈的使用方法如下:stack<T> st; //构造一个栈结构st.pop(); //弹出栈顶元素,无返回值st.top(); //返回栈顶元素

2021-02-06 13:29:19 64

原创 [Leetcode] 力扣46:全排列

思路回溯算法的典型题,将整个过程想象成一颗树的遍历。1.选择路径2.递归1-2-3过程3.退回选择用数组维护遍历过的元素,数组左侧遍历过,右侧没有遍历过class Solution {public: void dfs (vector<vector<int>>& res, vector<int>& temp, int now, int n) { if (now == n) { res.push_.

2021-01-29 13:59:01 13

原创 [Leetcode239] 力扣239:滑动窗口的最大值

class Solution {public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { int n = nums.size(); deque<int> q; vector<int> res; for (int i = 0; i < k; ++i) { while (!q.em.

2021-01-28 22:10:47 12

原创 [Leetcode724] 力扣724:寻找数组的中心索引

思路有关子数组和的问题可以思考能否用前缀和方法解决class Solution {public: int pivotIndex(vector<int>& nums) { int sum = 0; for (int& n : nums) { sum += n; } int preSum = 0; for (int i = 0; i < nums.size().

2021-01-28 11:52:45 21

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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