
C++
文章平均质量分 66
happy的
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
形参中使用常量引用,常量,普通引用的区别
C++中的引用,给我们提供了一种区别于C指针的形参定义方式。一般我们可以将其定义为1)普通引用void foo(int &n);2)常量void foo(const int n);3)常量引用void foo(const int& n);三种方法用途不一样,都可以通过编译。以普通引用为形参的函数,一般会更改实参的值,比如increment(int &...原创 2019-04-10 18:56:23 · 6550 阅读 · 5 评论 -
二分法的下标
二分法通常涉及到一前一后的下标i和j,这个技术用在了很多算法上,比如找第一个大于x的数,快排等等等等。下标一不小心就容易出错,这里总结一些一些用法。一、找第一个>=target的数int i = 0, j = A.size() - 1, mid;while(i < j){ mid = i + (j - i) / 2; if(A[mid] < targe...原创 2019-08-14 19:51:57 · 378 阅读 · 0 评论 -
有关堆的知识
堆分为最大堆和最小堆。最大堆定义:一个二叉树,每个节点的值大于其子节点。最小堆相反。一般用数组来表示堆,当然,用树,链表都可以,想怎么来怎么来。数组d,有n个节点,其中一些下标定义:1)d[k]的子节点为d[2*k+1]和d[2*k+2],当然这里的2*k+1和2*k+2都得小于n2)最后一个父节点的位置:d[n/2-1]3)d[k]节点的父节点的位置d[(k-1)/2]有...原创 2019-08-18 20:02:42 · 275 阅读 · 0 评论 -
数据结构类题目
凡是涉及到O(1)插入删除,然后还需要附带实现一个别的功能的(如获得随机数)绝对是hashtable + 链表或者数组或者别的数据结构。hashtable的key一般就是插入的值,然后value一般是有用的数据,如LRU里的链表的地址,如array里的下标等等。举个例子:O(1)插入删除并等概率随机返回一个数构建一个数组array,存插入的数构建一个hashtable,key是...原创 2019-08-08 19:04:56 · 182 阅读 · 0 评论 -
关于maxpooling和avgpooling
面试题经常会出maxpooling和avgpooling的优化,具体思路是1)对于avgpooling,使用动态规划2)对于maxpooling,使用队列维护历史最大值具体代码细节后续再补充。学习了这两种方法后,有点好奇真正的框架中是怎么实现pooling的,于是去找caffe的底层代码,发现并不是这样操作。具体操作思路:对于GPU上计算pooling,由于有大量的计算单元,可...原创 2019-08-05 11:50:30 · 5599 阅读 · 0 评论 -
关于快速幂
对于一个数求幂,我们有下面的公式当n为偶数,当n为奇数,这里的除法是c++里面的整数除法。快速幂的代码:float power(const float x, const int k){ float result = 1, base = x; int p = (k > 0) ? k : -k; while(p){ if(p &...原创 2019-07-21 14:53:23 · 133 阅读 · 0 评论 -
leetcode 24点问题
遇到这种问题,建模是关键,想清楚怎么构建模型。class Solution {public: bool solve(vector<float> &nums){ if(nums.size() == 1) return abs(nums[0] - 24.0) < 1e-5; for(int i=0; i<nums.size...原创 2019-07-20 19:35:54 · 724 阅读 · 0 评论 -
leetcode1091 最短路径
神奇,居然只能用宽搜如果是深搜索的话,可能会错过最短路径。(最短路径用宽搜一定要记得)struct Node{ int x; int y; int length; Node(int x, int y, int length) :x(x), y(y), length(length){}};class Solution {public: int ...原创 2019-07-17 23:44:32 · 474 阅读 · 0 评论 -
dp 通配符匹配leetcode44
这一题是剑指offer里面的题目,但是书本里的解法自顶向下,不太好理解。假设string长度为S,pattern长度为P,设定状态dp,为 `dp[S+1][P+1]`状态含义:dp[i][j]表示pattern的1到j位是否匹配s的1---i位初始状态:dp[0][0] = 1dp[0][i] = p[i] == '*' && dp[0][i-1] 这里匹...原创 2019-07-20 10:45:23 · 131 阅读 · 0 评论 -
数组中单独出现的两个数
数组中有若干个数,有两个数只出现一次,其余的数都出现了两次,求出这两个单独出现的数。leetcode260假设两个数分别为a和b,思路就是先每个异或,然后得出a和b相异的位,结果为ans然后取出ans最后为1的位,把原来的数组分开,再异或一次,得到答案。这里取ans最后一位1的操作很巧妙:ans = ans & (-ans)假设一个数ans为xxxxxxx10000...原创 2019-08-11 16:38:23 · 271 阅读 · 0 评论 -
linux c语言的struct对齐方法
为了索引方便,数据放的位置都需要在其自身大小的倍数位置上。对齐规则:1)按照定义顺序,逐个变量进行对齐,起始地址为0。当前变量的起始地址必须为当前变量的字节数的整数倍。2)按照当前编译过的最大变量申请空间。初始空间为0。3)如果有嵌套结构体,则: 1、先在嵌套结构体内部按照规则1)2)进行对齐,得到嵌套结构体的大小,以及嵌套结构体内的最大变量的字节数 ...原创 2019-08-24 21:40:02 · 282 阅读 · 0 评论 -
C++/C 编译链接过程
运行C++代码的过程分为预处理,编译,汇编,链接四个步骤(Preprocessing, Compiling, Assemble and Linking )一、预处理(Preprocessing)预处理过程处理所有的#开头的预定义语句,比如#include,#define宏等。从.cpp 或者.c文件生成.i文件gcc -E test.c -o test.i# orcpp te...原创 2019-09-05 11:41:55 · 269 阅读 · 1 评论 -
关于数组指针
自从知道了vector的增长规则后,觉得还是用数组靠谱。最近发现数组用起来有很多问题,数组和指针的区别,多维数组传参,数组指针和指针数组,函数指针,到了C++后还出现了数组的引用等等。搞得有点头疼。这里开一篇文章梳理一下。一、数组、指针以及引用复合类型(compound type),是基于其他类型定义的类型(《C++ Primer》p45)。数组指针引用都属于复合类型。数组(array...原创 2019-09-04 20:36:36 · 206 阅读 · 0 评论 -
滴滴笔试的一些记录
一、struct对齐编译过程中,从上到下编译:1.按照当前最长的元素申请空间2.按照当前元素长度对齐比如一个比较典型的例子struct node{ char a; //char a的时候,当前最大为1,申请空间为1,故a地址为0-1(相对node偏移) int b; //当前最大b为4,并且空间不够,所以按照4的倍数申请空间0-8,并且b需要对齐到4倍数的...原创 2019-08-28 08:39:05 · 567 阅读 · 0 评论 -
关于字典序
今天刷到leetcode 440,发现有关字典序的一个方法:树。问题如下:给定整数n和k,找到1到n中字典序第k小的数字。注意:1 ≤ k ≤ n ≤ 109。示例 :输入:n: 13 k: 2输出:10解释:字典序的排列是 [1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9],所以第二小的数字是 10。...原创 2019-08-22 21:51:02 · 639 阅读 · 0 评论 -
两个贪心算法——Leetcode321拼接最大数和Leetcode316去除重复字母
贪心算法和梯度下降法很像,每一步取当前最优解。但是得保证每一步取最优解,最后会取到全局最优解。首先看Leetcode316,去除重复字母。题目是这样的:给定一个仅包含小写字母的字符串,去除字符串中重复的字母,使得每个字母只出现一次。需保证返回结果的字典序最小(要求不能打乱其他字符的相对位置)。示例 1:输入: "bcabc"输出: "abc"示例 2:输入: "cbacdc...原创 2019-08-16 17:44:40 · 452 阅读 · 0 评论 -
判断凸四边形_外积
两个向量的外积定义:a = (x1, y1) b = (x2, y2)a ✖️ b = x1y2-x2y1https://www.cnblogs.com/xiaojianliu/p/9964246.html具体参见上面博客。通过外积正负号,可以判定两个向量的相对位置,也就是夹角。夹角的性质,可以用来解决判别凸多边形,一个点在多边形内等问题。例如:判别凸多边形:向量每...原创 2019-08-12 22:18:16 · 3179 阅读 · 1 评论 -
wiggle sort和颜色分类
今天做了摆动排序二324。题目要求:给定一个无序的数组nums,将它重新排列成nums[0] < nums[1] > nums[2] < nums[3]...的顺序。网上一个解答:https://leetcode.com/problems/wiggle-sort-ii/discuss/77677/ono1-after-median-virtual-indexin...原创 2019-08-12 21:37:57 · 147 阅读 · 0 评论 -
01矩阵541
找到每个元素距离0最近的距离BFS可以有很多个起点,思路要放开。以所有为0的点为起点,开始遍历。class Solution {public: vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) { int n = matrix.siz...原创 2019-07-19 22:15:09 · 114 阅读 · 0 评论 -
kth-largest-element-in-an-array_leetcode
这题用了快排的思想,思路如下:数组从小到大排序思想更为直观,所以一开始先k = n-k1)选一个pivot,然后把pivot放在合适的位置,也就是快排的Partion操作,把小于pivot的放前面,大于pivot的放后面。2)如果pivot的位置等于k,则返回pivot3)如果pivot的位置大于k,则证明要找的数在pivot前面,否则在后面,然后递归就可以了。特别的,如果le...原创 2019-07-08 23:26:32 · 143 阅读 · 0 评论 -
Sort character by frequency
注意字符串的操作,这道题就是把所有的字符统计起来,然后每次拼接找最大值static int fast_io = []() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); return 0;}();class Solution {public: string frequenc...原创 2019-06-24 22:35:21 · 223 阅读 · 0 评论 -
Leetcode_find_k_pairs_smallest_sum
利用堆,维护当前最小值。vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) { auto cmp = [](pair<int, int> x, pair<int, int> y)...原创 2019-06-24 21:58:06 · 166 阅读 · 0 评论 -
链表排序——单链表快排与归并
单链表有一个重要的特性,就是只能从前往后遍历。所以单链表的排序方法和普通的数组排序不一样。一、快排数组快排需要两个指针,一前一后往中间靠拢。由于单链表只能单向遍历,故需要设计不同的算法。设定p和q指针,并且规定p和q之间的数都是大于pivot的数(包含p)。1)p从start开始,也就是一开始p就是满足条件的p指针,q从p的下一个指针开始,也就是待判定的节点。2)当q的数大于等...原创 2019-07-08 21:51:22 · 192 阅读 · 0 评论 -
关于查找算法
二分查找算法最主要是确定递归的选择。有相应的模板可以套用:1)求中位值mid = (left + right) / 22)确定递归思路什么情况下递归[left, mid - 1],什么情况下递归[mid+1, right]一般题目都比较好分析。用leetcode的33题举例:int search(vector<int> &nums, int ta...原创 2019-07-08 20:51:39 · 164 阅读 · 0 评论 -
堆_leetcode23,合并K个排序链表
利用堆排序,维护一个最小堆,取每个链表最前的节点组成堆,每次取出堆顶class Solution {public: ListNode* mergeKLists(vector<ListNode*>& lists) { ListNode *result = nullptr, *p = nullptr; auto cmp = []...原创 2019-06-24 21:05:17 · 127 阅读 · 0 评论 -
leetcode_402_Remove K Digits
使用栈来解题。主要思想:一个n位数,如果第i位比第i+1位要大,那么删掉第i位得到的数要比删掉第i+1位得到的数要小。给定一个栈,result入栈过程:int i = 0;while(i < num.size()){ while(k && result.size() && result.back() > num[i]){ ...原创 2019-06-10 09:17:23 · 133 阅读 · 0 评论 -
Leetcode 697
#697 Degree of an Array虽然思路差不多,但是代码值得斟酌int cnt[50000];class Solution {public: int findShortestSubArray(vector<int>& a) { ios_base::sync_with_stdio(false); cin.tie...原创 2019-06-05 22:32:08 · 170 阅读 · 0 评论 -
动态规划
这种题感觉难度极大,关键在于找到状态函数以及状态转移方程。leetcode32.Longest Valid Parentheses挺有代表性dp[i]代表s[:i],以s[i]为末尾的最长字串。当遇到----()的时候,+2,则为遇到有效的一对括号,则+2当遇到----))的时候,无法通过末尾判定是不是有效的。s[i-1]处,有d[i-1]长度的有效字符串,那么,只能越...原创 2019-07-09 22:42:48 · 102 阅读 · 0 评论 -
Leetcode 43字符串相乘
这种题目看起来简单,但是逻辑实现起来也不容易。一开始,思路没有打开,容易陷入拆东墙补西墙的修bug过程。第一个版本啰嗦且没有可读性:class Solution {public: string multiply(string num1, string num2) { int n1 = num1.size(); int n2 = num2.s...原创 2019-07-13 20:28:02 · 87 阅读 · 0 评论 -
关于二叉树的题目
对于非递归二叉树遍历,深度遍历使用stack,宽度遍历使用queue。模板:stack<TreeNode *> st; // or queue<TreeNode *> q;st.push(root);TreeNode *t;while(st.empty()){ t = st.top(); st.pop(); if(t){ st...原创 2019-07-16 21:41:50 · 153 阅读 · 0 评论 -
第k个排列的数.
关于排列的题目要分清楚里面的逻辑关系。假设现在剩余的字符数组为nums要取第k个排列,那么,第i位,取得就是nums里面的(k-1)/(i-1)! + 1位。class Solution {public: string getPermutation(int n, int k) { string result = ""; vector&l...原创 2019-07-18 22:55:46 · 156 阅读 · 0 评论 -
leetcode 162
二分法求极大值,居然一边ac,少有的感觉class Solution {public: int findPeakElement(vector<int>& nums) { int n = nums.size(); if(n == 0) return INT_MIN; if(n == 1) return 0; ...原创 2019-07-18 22:23:36 · 183 阅读 · 0 评论 -
关于数据溢出
回过头来看leetcode7,如何判定数据溢出。可以采用提前判定法,也就是判定溢出之前一步的状态,如果满足就溢出。class Solution {public: int reverse(int x) { int ans = 0; int a = INT_MAX % 10; int b = INT_MIN % 10; ...原创 2019-07-18 19:32:51 · 172 阅读 · 0 评论 -
关于进程和线程的面试题
在腾讯实习做了点多进程提取特征的工作就往简历上写...其实懂得也不深,自己挖的坑,能填一点是一点吧。一、进程和线程的区别:进程是系统进行资源分配和调度的基本单位线程时操作系统能够进行调度运算的最小单位,被包含在进程之中,是进程中实际运作的单位。区别:地址空间和资源:进程间相互独立,同一进程中的各个线程共享,某进程中的线程在其他进程中不可见通信:进程间通信使用管道等等,线程间...原创 2019-07-18 11:49:00 · 681 阅读 · 0 评论 -
寻找二叉树最大深度104lc
今天头条面试遇到这道题,还要求出路径。非递归虽然很直观,但是要加上一个栈保存每个节点的深度。如果要非递归保存路径的话,还得加一个栈保存路径。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right...原创 2019-07-15 21:57:12 · 132 阅读 · 0 评论 -
lc74 搜索有序二维数组
这道题一开始以为纵向一次二分,然后再横向二分会比较快。但其实把整个数组展开,二分查找O(log(mn)) = O(logm) + O(logn),其实一样。两次查找的方法:class Solution {public: bool searchMatrix(vector<vector<int>>& matrix, int target) { ...原创 2019-07-14 23:04:58 · 177 阅读 · 0 评论 -
leetcode 222——完全二叉树节点个数
二分法求解。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * };...原创 2019-07-14 16:20:02 · 98 阅读 · 0 评论 -
c/c++ 指针管理的一些东西
当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称悬垂指针(也叫迷途指针)。Dangling pointer某些编程语言允许未初始化的指针的存在,而这类指针即为野指针。 Wild Pointer首先是空指针判断之类的,防止引用空指针这都很简单。最主要的是指针带来的内存泄露的问题。先看什么时候会销毁智能指针,太...原创 2019-09-07 19:00:50 · 364 阅读 · 0 评论