自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Leetcode 394. 字符串解码 处理字符串括号嵌套问题

这道题目的难点在于括号存在嵌套。比如样例2, 这个是可以用栈去解决的。这里主要介绍递归的解法:递归的难点在于需要再解析字符串的同时,进行递归。思路是遇到左括号就递归解析,遇到右括号就返回递归的结果。同时注意数字的处理。class Solution {public: string decodeString(string s) { int index = 0; return helper(s,index); } string help..

2020-08-31 19:29:46 394

原创 高频面试题:互斥锁,自旋锁,原子操作,CAS

互斥锁:同一时间,只有一个线程可以访问共享变量。自选锁:不让线程切换。原子操作:操作不可分割。CAS 比较并交换,比较变量有没有被修改。

2020-08-31 17:25:24 381

原创 腾讯面试题connect和accept发生在三次握手的哪个阶段

客户端调用connect的时候,就是发一个syn服务端accept的时候,实际上是从内核的accept队列里面取一个连接,如果这个队列为空,则进程阻塞(阻塞模式下)。如果accept返回则说明成功取到一个连接,返回到应用层。大致的过程是客户端发一个syn之后,服务端将这个连接放入到backlog队列,在收到客户端的ack之后将这个请求移到accept队列。所以accept一定是发生在三次握手之后,connect只是发一个syn而已额,Accept根本不参与三次握手,服务器只要Liste.

2020-08-31 17:13:31 2702 1

原创 Leetcode 24 两两交换链表中的节点. (bigo面试题 递归和非递归)

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4, 你应该返回 2->1->4->3.递归解法:class Solution {public: ListNode* swapPairs(ListNode* head) { if(head==NULL) return head; if(head->next

2020-08-31 17:09:19 117

原创 Leetcode 784. 字母大小写全排列 (典型的回溯问题)

典型的回溯算法class Solution {public: vector<string> res; vector<string> letterCasePermutation(string S) { string path; dfs(S,0,path); return res; } void dfs(string S, int index, string path){ if(..

2020-08-31 14:27:41 182

原创 Leetcode 1315. 祖父节点值为偶数的节点和 BFS遍历求和(推荐写法)

/** * 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: int sumEvenGrandparent(TreeN...

2020-08-31 14:02:32 134

原创 Leetcode 1087. 字母切换 括号展开回溯题目(无括号嵌套)

明天完成。

2020-08-31 01:30:56 448

原创 经典面试智力题:老鼠和毒药问题(二进制应用)

老鼠和毒药实验室有100个瓶子,其中有一瓶装有慢性毒药(第3天发作),另外99瓶装有蒸馏水。请问至少需要多少只小白鼠才能在3天内找出哪一瓶是慢性毒药?利用二进制来做,最少的老鼠数量就是计算2的多少次方大于等于瓶子数量,例如本题为7。对100瓶进行二进制编码,这样可以排列出1xxxxxx,x1xxxxxx,...,xxxxxx1这样的七组序列。7只老鼠分别去喝这些组合的药。第1只老鼠死了,说明有毒的药第1位一定是1,反之一定是0同理第二只,第三只。。。可以确定有毒药的药物的二进制表示。

2020-08-31 01:20:54 4452

原创 Leetcode 经典滑动窗口题目总结

Leetcode 3 无重复字符的最大子串Leetcode 159至多包含两个不同字符的最长子串Leetcode 340至多包含 K 个不同字符的最长子串Leetcode 424替换后的最长重复字符Leetcode 992K 个不同整数的子数组Leetcode 1156单字符重复子串的最大长度1004. 最大连续1的个数 III01序列版本选择性刷题https://leetcode.com/discuss/interview-question?current...

2020-08-31 00:56:34 516

原创 微软滑动窗口双指针面试题Leetcode424/1156

Given an array with around 10w elements, each element is within [0,10w], how to get max subsequense length with same value if you have a opportunity to swap two elements?Sampes:1,1,0,2,3,1,0,1,1,3,4 => output: 40,2,3,1,0,1,1,3,4 => output: 31,1,

2020-08-31 00:44:10 197

原创 Leetcode 253 会议室Ⅱ 区间贪心问题

由于每个会议都要按期进行,所以我们首先按照会议开始的时间排序那么如何申请会议室呢?对于给定一个时刻,我们要找到之前最早结束的会议时间,看看这个结束时间是否早于当前会议开始时间,如果早于,那么不用再申请新的会议室,否则,我们就要去申请新的会议室。如何查找到最早结束会议的时间,用最小堆来维护。class Solution {public: int minMeetingRooms(vector<vector<int>>& intervals) { ..

2020-08-30 20:55:06 300

原创 跳表简单介绍

跳表是为了让链表的查找更快而诞生的一种数据结构跳表在链表的基础上,向上建立索引跳表的查找从最上层开始,逐层向下进行查找跳表的插入:需要先在链表中插入数据,再去跟新索引。跳表的上层节点个数一般是下层节点个数的1/2跳表插入和删除的时间复杂近似为O(logN)...

2020-08-30 20:05:38 171

原创 TCP 三次握手和四次挥手图记忆

通俗解释版本为什么必须三次,而不是两次?两次一定不行,假设第一次包超时了。那么就会建立起两次连接。四次挥手过程为什么是四次不是三次,被动放的第二次和第三次不能合并。...

2020-08-30 17:21:25 157

原创 Leetcode 557. 反转字符串中的单词 III (经典双指针技巧)

就是一个原地双指针技巧。class Solution {public: string reverseWords(string s) { for(int i=0,j=0;j<s.size();i++){ while(j<s.size()&&s[j]!=' ') j++; reverse(s.begin()+i,s.begin()+j); i=j++; } ..

2020-08-30 01:07:06 126

原创 C++/Python/Java sort函数自定义排序使用

在算法题中,sort函数自定义排序,是经常使用的。在C++中通常这样写sort(nums.begin(), nums.end(), cmp);其中cmp是一个函数指针,传入一个自定义比较函数,这个函数这样写bool cmp(const int& a, const int& b){ return a > b; //从大到小排序}这个函数参数与容器的参数相对应,这个写法是一种简单直接的写法。这种写法可以用lammda表达式简写 vec

2020-08-29 12:23:23 424

原创 Leetcode 273 整数转换为英文表示 比较麻烦的模拟题

先要存下来1-19,以及20到90这几个特殊的数字,还有thound, million ,billion string num0_19[20] = { "Zero", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixte..

2020-08-28 22:15:09 172

原创 外企动态规划难题: Grouping Options

回溯暴搜,剪枝叶,只能过小规模数据这时考虑dp了dp[i][j] 表示前i个人分成j组的分法。那么dp[i][i], i=1…n肯定是1。对于dp[i][j]而言,我们可以把这j个组每个组分一个,那么剩下i-j个人,这i-j个人可以全部分配到最后1个组(对应dp[i-j][1]),也可以全部分配到最后2个组(对应dp[i-j][2]),…,也可以全部分配到全部的j个组(对应dp[i-j][j])。所以要用再用一个循环把这些方案都加起来就是dp[i][j]。解法2:...

2020-08-28 18:15:04 349

原创 Leetcode 295. 数据流的中位数 动态求解中位数

流式数据,不断有数据进来,维护两个堆,一个大顶堆,一个小顶堆。下面大定堆,上面是小顶堆,当大顶堆元素始小于等于小顶堆元素加1。可以很容易知道,如果当前数据流总数为偶数,答案就是堆顶元素之和/2如果为奇数,答案就是大顶堆元素。在插入过程中,先看是插在下面还是上面,然后再动态调整。class MedianFinder {public: /** initialize your data structure here. */ priority_qu...

2020-08-28 15:44:54 260

原创 Leetcode 287 寻找重复元素 (O(1)空间,不排序)解法

双重循环,枚举每个数,O(n^2)分治,我们来找答案的区间:假设答案在[left,right]这个数的区间里,那么根据抽屉原理,整个数在[left,right]中的个数一定大于right-left+1, 因为答案出现了两次。根据这个原理,我们每次可以将搜索的数的范围砍掉一半,因此最终的时间复杂度是O(nlogn)class Solution {public: int findDuplicate(vector<int>& nums) { /...

2020-08-28 15:11:57 250

原创 周末笔试面试时间

Garena 8/28 晚上7点到9点笔试农行笔试 8月29 早上9点招联金融面试 8月29日,下午5点滴滴面试 8月30日,下午3点

2020-08-28 13:40:36 213

原创 2020年7月和2019年12月六级作文

最近六级以议论文为主。The best preparation for tomorrow is doing your best today.talking is cheap, show me your code.the importance of having a sense of social responsibility社会责任。内容难写the importance of having a sense of family responsibilit...

2020-08-27 23:19:12 983

原创 8/27 亚马逊笔试题思路

3道题目1. 签到送分题将数组划分为n个子数组,满足每一个子数组没有重复元素,求最小的n,这道题目非常简单。第1题用map记录每个数字出现次数,取最大的即可。AC2. 有难度的动态规划题目,(暴力模拟能过8/11)一个数组,如果取了一个数num,就要将num-1和num+1删掉,对剩下所有数求和。求最大值。第二题DP题,dp数组声明为vector<vector<int>>dp(1e6+5,vector<int>(2,0));DP...

2020-08-27 20:57:28 719 1

原创 面试简单题:二进制中一的个数

class Solution {public: int hammingWeight(uint32_t n) { int res = 0; while(n){ res+=(n&1); n>>=1; } return res; }};32位无符号整数,当然可以这样写对于负数,会出现死循环,枚举32位即可,这种负数也行。class Soluti...

2020-08-27 18:21:53 87

原创 C++ 经典面试题:迭代器批量删除vector中满足条件的元素

使用迭代器遍历以及erase函数进行删除vector<int> val = { 1,2,3,4,5,6 }; vector<int>::iterator iter; for (iter = val.begin(); iter != val.end(); ) { if (3 == *iter) iter = val.erase(iter); //返回下一个有效的迭代器,无需+1 else

2020-08-27 15:47:36 424

原创 C++和Java 单例模式

C++ big Three 全部私有,懒汉式#include <iostream>// version1:// with problems below:// 1. thread is not safe// 2. memory leakclass Singleton{private: Singleton(){ std::cout<<"constructor called!"<<std::endl; } Singl.

2020-08-27 15:37:32 124

原创 秋招随想8/26

心态准则:1. 成年人的世界不是线性的,没有拿到offer,简历被刷很正常。2. 尽可能的把握机会,选择最适合自己的机会。简历与投递岗位要求符合非科班要尽可能的把自己的简历搞得和科班的基本看不出大的区别。关于算法题:外企以及对算法要求高的企业,Leetcode400以上,多多益善,系统的解题思路其他:Leetcode200/剑指offer, 常见套路题。基础知识?常见智力题(1) 100层楼,只有2个鸡蛋,想要判断出那一层刚好让鸡蛋碎...

2020-08-26 17:06:34 290

原创 Leetcode 17. 电话号码的字母组合 典型的回溯搜索问题。

非常典型的回溯搜索2可选abc,下一层3可选defstring phone[]= {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};class Solution {public: vector<string> res; vector<string> letterCombinations(string digits) { if(digits.size()==0) ret..

2020-08-26 01:46:15 130

原创 Leetcode 高频面试题 股票交易问题详解

一. 只能买一次,卖一次 (Leetcode 121)这是最简单的情况,最低点买入,最高点卖出就行。class Solution {public: int maxProfit(vector<int>& prices) { // 最低点买,最高点卖 if(prices.size()==0) return 0; int profit = 0, buyPrice = prices[0]; for(auto pr

2020-08-25 21:56:43 260

原创 高频面试题Leetcode 31 下一个排列(O(N)的算法)

这道题目的思路比较具有跳跃性。难度较大。最大的数从后往前一定是升序的,比如321要想发现这个规律,必须看一个比较大的数//12385764我们发现,764这个后缀是升序的,5恰好是分界点,1238是前缀。下一个排列一定是1238前缀不变,764中,将6和5交换1238 6 567 最后在反序。画图直观解释class Solution {public: void nextPermutation(vector<int>& nums) {...

2020-08-25 20:18:12 118

原创 经典面试题:64匹马,8个赛道,找出前4名最少比赛多少场?

第一步:全部马分8组,各跑一次,然后淘汰掉每组的后四名(8次);此时,只有列上有大小关系,行上是没有大小关系的。

2020-08-25 17:13:19 2422 2

原创 Leetcode 289. 生命游戏 (细胞自动机)

二维网格遍历注意使用技巧让代码可读性强。原始的思路是使用一个二维数组进行更新,当全部更新完以后,复制这个二维数组到原来的数组上。可不可以优化,不使用额外的空间,答案是可以的细胞的状态如下: 活->活 1 活->死 -1 死->活 2 死->死 0由于特殊...

2020-08-25 14:52:08 308

原创 Leetcode 491. 递增子序列 (暴搜所有递增子序列,难点在剪枝去重)

使用回溯模板进行搜索。class Solution {public: vector<vector<int>> res; vector<vector<int>> findSubsequences(vector<int>& nums) { vector<int> path; dfs(0,nums,path); return res; } ...

2020-08-25 01:29:47 157

原创 Leetcode 260. 只出现一次的数字 (位运算)

只有一个元素只出现,其余都出现两次,那么一次位运算就能解决。如果有两个数只出现一次,其余两个数都只出现一次,一次位运算得到的是a^b,那么如何分开这两个数?这个思路比较有跳跃性,a和b不同,所以a和b至少有一位不同,不妨取一个最低位k,一个必为0,另外一个必为1,然后将剩下的数按照位为1和位0分为两组,就等价于两个前面的问题。这个思路跳跃性比较强。不容易想到。class Solution {public: int find(vector<int>& ...

2020-08-24 21:52:25 154

原创 Leetcode 264 求第k个丑数

可以用过如下方式归并得到丑数可以用前一个丑数*2,*3,*5得到后面的丑数。

2020-08-24 20:34:36 133

原创 高频面试题:圆内任取两条弦,两条弦在在圆内相交的概率是?

给定A,B,C和D必须在AB两侧,才可能相交。所以严格来说,需要算一个积分。当然有简化做法。

2020-08-24 19:29:58 3040

原创 Leetcode 292 取石子博弈游戏(数学题)

4个石头,必输5个石头,拿一个,对手四个,必赢6个石头,拿两个,对手四个,必赢7个石头,拿三个,对手四个,必赢8个石头,不论拿多少个,对手总能拿到4,必输。由此总结出规律,只要是4的倍数,那么必输,否则,就必赢。...

2020-08-24 16:24:12 285

原创 Leetcode 313 超级丑数 丑数的加强版(本质是一种动态规划)

class Solution {public: int nthSuperUglyNumber(int n, vector<int>& primes) { vector<int> dp(n); // 表示超级丑数 int m = primes.size(); vector<int> index(m); dp[0] = 1; for(int i=1;i&l...

2020-08-24 13:59:02 134

原创 最新面试高频算法题

3.100亿url,怎么看某个url已经存在(手写一个布隆过滤器即可)4.100亿url,怎么求TopK(hash,然后小根堆)6.算法:判断—棵二叉树是否是对称的7.算法:有若干[30,50,100]优惠券,求给定一个数值求最优的方案。例如∶价格是40=>[30]80 =>[30,50].110=>[30,30,50] (dp)Leetcode 1419 数青蛙4.算法:最长合法的括号匹配 (Leetcode原题)1. 字符串中数字位置...

2020-08-24 13:31:32 439

原创 经典面试题,长度为1的的线段分为三段,能构成三角形的概率

答案1/4三段长度分别为x,y,1-x-yx>0,y>0,x+y<1两边之和大于第三边x+y>1-x-y, x+y>1/2x+1-x-y > y y>1/2y+1-x-y>x x>1/2

2020-08-23 19:11:39 1567

原创 Leetcode 面试题 17.24. 最大子矩阵 (最大子数组和的二维版本)

1. 暴力做法枚举r1,c1, r2, c2,求和,时间复杂度O(N^6)很爆炸。2. 优化方法,二维前缀和优化,O(1)时间内求出给定r1,c1,r2,c2区域的和,时间复杂度为O(N^4)3. 降维动态规划优化。枚举起始行和结束行,对列求和,等效成一维最大子序列问题。由于所有起始行和结束行都枚举过,所以这个做法一定是对的。这道题目还需要记录更新r1,c1,r2,c2比一般的题目要难。class Solution {public: vector<int>..

2020-08-23 17:48:00 1142

空空如也

空空如也

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

TA关注的人

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