自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【西安xxx面经】

我是在线下一天面完的,总共有五面。一面:自我介绍,问题基本上都是根据简历上问的,我简历上写了算法和数据结构所以问题都是和这些相关。一面有两个面试官,先问了面向对象的思想,面向对象的三大特性,分别解释一下。然后就是数据结构方面的知识:栈,队列,哈希表,如果数据很多的话用哈希表怎么存储。手撕二分,然后手撕一个关于链表的题:现在有很多节点,每个节点都有它在链表中的编号,现在要按照编号将这个链表复原。(因为面试官没有c++环境,所以我用的记事本编程,需要讲出来思路,每一句的作用)。面试体验:两个面试官还是有压力

2021-09-26 10:06:47 245 1

原创 [Lecode]33. 搜索旋转排序数组

20214/13,题意如下:题目要求设计时间复杂度为O(lgN)的算法,那么只能用二分了,旋转数组和普通的数组区别就是把前面的一部分移到后面去了,那么这后半部分和前半部分还是有序的,我们将二分修改一下就好了。c++参考代码:class Solution {public: int search(vector<int>& nums, int target) { int n=nums.size(); if(!n) return -1;

2021-04-13 20:17:56 145

原创 [Leecode] 32. 最长有效括号

2021/4/11,题意如下:困难题瞄了题解才有思路,第一种思路是用栈,栈中存的是左括号的下标,每次输入一个右括号就让这个右括号的下标减去和没有构成匹配前一个左括号的下标。需要注意的是要在输入之前在栈中加入一个-1让第一个匹配的右括号有值。c++参考代码:class Solution {public: int longestValidParentheses(string s) { stack<int> st; int n=s.size(); int

2021-04-11 21:25:18 178

原创 [Leecode]31. 下一个排列

2021/4/10,题意如下:根据字典序排序的定义,从左往右扫到的第一位大的数就大。我们要优先把从左往右的第一个比它前面小的数和它后面第一个比它大的数交换,然后再把这个位置后面的从小到大排序就好了。(可以参照数字大小的判断方法,只是要求最小的排列)。c++参考代码:class Solution {public: void nextPermutation(vector<int>& nums) { int n=nums.size(); for

2021-04-10 21:39:54 127

原创 [Lecode]15. 三数之和

2021/4/8,开始刷Lecood TOP100,题意如下:思路就是先排序,然后从左开始先固定一个值,然后在使用两个下标,在剩下的里面找看有没有能够和为0的,有的话就存下来。要注意的细节就是相等的值要跳过避免重复。c++参考代码:class Solution {public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>&gt

2021-04-08 18:01:51 99

原创 [剑指 Offer] 60. n个骰子的点数

2021/4/7,又是跟着K神刷题的一天,题意如下:暴力的时间复杂度是6n,肯定会超时。看了题解的动态规划思路真是妙啊。假设我们已经知道n-1个骰子各个点数的概率,那么加了一个骰子的话只是在之前各个点数的概率上乘了1/6(当然有些点数不可能出现)。可以理解为每个点数对下一个骰子各个可能出现的点数的贡献。具体实现看代码:class Solution {public: vector<double> dicesProbability(int n) { vector<dou

2021-04-07 18:41:26 79

原创 [剑指 Offer]56 - II. 数组中数字出现的次数 II

2021/4/6,题意如下:和之前不一样的是把出现两次改成了出现三次,一开始有两种思路,一种就是空间复杂度O(N)的用map标记一下,一种就是时间复杂度O(NlgN)的排序然后找。看了K神的题解发现了位运算的方法确实牛,就是把每一位出现的次数记下来,然后取余3就是只剩下出现一次的数了。c++参考代码:class Solution {public: int singleNumber(vector<int>& nums) { vector<int&gt

2021-04-06 19:15:33 91

原创 [剑指Offer] 45. 把数组排成最小的数(优先队列重载)

2021/4/5,记录一下学到了优先队列的重载:思路很简单,就排序就行了,先把数字转换成字符串,然后比较他们的先后顺序组成的数字哪个大就行了。一开始用了sort自定义排序,然后用了优先队列的重载(学到了优先队列重载的是小于号,我一开始用的大于号一直报错hh)sort自定义排序代码:class Solution {public:static bool cmp(int a,int b) { string x=to_string(a)+to_string(b); string y=

2021-04-05 21:07:52 70

原创 [剑指Offer] 38. 字符串的排列

2021/4/5,题意如下:既然是全排列思路肯定是dfs,我的思路是标记每一位已经排好顺序的字符,加入没排序的字符然后再回溯+剪枝就好了。但是有一个问题就是把相同的字符看做了不同的字符,所以如果原来的字符串中有相同的字符会出现重复的排列。所以我们要使用一个set去重就好了。c++参考代码:class Solution {public:set<string> st;bool v[10]={false};void dfs(string s,string now){ if(now

2021-04-05 19:55:00 75

原创 [剑指 Offer] 36. 二叉搜索树与双向链表

2021/4/4,又是跟k神学习的一天,题意如下:首先二叉搜索树顺序输出我们可以考虑中序遍历,但是这道题我们要构造双向链表,并且是把这个树转换成链表,那么我们可以根据中序遍历的思想把输出改成链接操作就可以了,并且因为是双向链表,所以我们要添加一个pre表示当前节点的前一个节点,然后链接就好了,具体实现看代码。/*// Definition for a Node.class Node {public: int val; Node* left; Node* right;

2021-04-04 19:21:12 93

原创 [剑指 Offer]35. 复杂链表的复制

2021/4/3,依旧是剑指Offer的一天,题意如下:第一个思路肯定是先跑一边把所有链表都记下来,然后再创建一个链表从头连起来就好了。当然这样的空间复杂度会到O(N),然后看到题解的思路顿时觉得牛哇。思路是在每个节点后再复制一个节点,然后根据原节点的random的值去让复制的这个节点去指向复制的random的值,最后再把这两个链表拆开就好了,具体做法看代码吧,膜拜大佬中orz第一种思路:/*// Definition for a Node.class Node {public: in

2021-04-03 21:08:15 67

原创 [剑指Offer] 33. 二叉搜索树的后序遍历序列

2021/4/2,还是要好好刷算法题啊,题意如下:二叉搜索树的特点是左子树的值都比根节点小,右子树的值都比根节点大。而后序遍历的根节点在最后,所以我们可以根据值和根节点的大小关系分为左子树和右子树。找到左子树和右子树后判断是否满足和根节点的条件,然后再用递归的思想继续判断左子树和右子树,都满足条件就返回true。c++参考代码:class Solution {public: bool pd(vector<int>& postorder,int l,int r)

2021-04-02 20:43:16 74

原创 [我太菜了]ipv4转化成数字

将ipv4转化成十进制的数字,我太菜了这都没想出来。就是用位运算就好了,八位八位的位移就好了。#include<bits/stdc++.h>#define PI 3.14159265358979323846#define maxn 200000#define ll long long#define Inf 0x3f3f3f3fusing namespace std;int f(string a){ int ans=0; for(int i=0;i<a.si

2021-04-01 21:01:02 122

原创 [剑指Offer] 56 - I. 数组中数字出现的次数

2021/3/31,今天又学到了一个题,题意如下:首先如果只有一个数出现了一次的话,我们可以整体异或来找出这个数,因为出现两次的数在异或过程中都消除了。但是有两个数的话我们这样操作求得的值是x^y的值。所以我们可以通过找出这个值中的一个1,然候根据这个1把数字分成两组,两组分组求异或就是答案了(很巧妙)。c++参考代码:class Solution {public: vector<int> singleNumbers(vector<int>& nums) {

2021-03-31 16:22:03 74

原创 [剑指 Offer] 49. 丑数

2021/3/30,今天做了一个听闻已久的题:丑数。题意如下:首先判断一个数是不是丑数并不困难,让这个数一直除2,3,5直到除不尽为止,如果能除尽就是丑数。但是这个题让找第n个丑数,首先我想到的是打表,但是复杂度太高超时了。后来看了题解学习了一种做法,下一个丑数一定是之前的某一个丑数乘2,3,5乘出来的,并且是他们中最小的那一个。但是要实现这个有点困难,看了题解的代码觉得真的牛哇,具体实现看代码:class Solution {public: int nthUglyNumber(int n)

2021-03-30 19:33:02 48

原创 [剑指 Offer]44.数字序列中某一位的数字

2021/3/29,今天遇到有意思的题是44. 数字序列中某一位的数字,题意如下:这题一开始没有什么思路,看了题解知道了是个找规律的题。比如如果n是个三位数,那么它前面的两位数的位数是固定的,这些固定的位数我们能算出来,然后再根据剩下的位数确定n在的那一个数,然后再确定n位上的数字就行了。c++参考代码:class Solution {public: int findNthDigit(int n) { long long st=1;//每m位数的起始数 long l

2021-03-29 23:02:27 100

原创 [剑指Offer]14- I. 剪绳子

2021/3/28,今天做了个挺有意思的题,题意如下:最开始没啥思路,瞅了一眼题解有dp和贪心的做法。首先dp的做法就是设dp[i]是长度为i的绳子乘积最大值,遍历每一个j的值,i要么减去j的值就不减了,要么减去j之后再考虑j长度的绳子,所以状态转移方程是有dp[i]=max(dp[i],max(j*(i-j),j*dp[i-j]));c++参考代码:class Solution {public: int cuttingRope(int n) { vector<int&gt

2021-03-28 21:14:02 70

原创 [剑指Offer]12. 矩阵中的路径

2021/3/27,题意如下:其实也没啥好说的,深搜+剪枝就行了,不过代码中还是有很多细节要注意的。c++参考代码:class Solution {public: int n,m; int f[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; bool dfs(vector<vector<char>> board, string word,int i,int j,int k) { if(k==word.size()

2021-03-27 20:02:43 73

原创 [剑指Offer]39. 数组中出现次数超过一半的数字

2021/3/26,今天看到了个很有意思的题:这是一道面试问的题,但是想不到除了遍历标记和排序也没有什么优化的方法。然后看了一个大佬的思路顿时感觉自己还是太笨了。我们既然要求最多出现次数的数,我们可以将两两不相同的数消去,这样最后剩下的数就是出现次数超过一半的数了。c++参考代码:class Solution {public: int majorityElement(vector<int>& nums) { int now=0,sum=0; fo

2021-03-26 22:45:59 84

原创 [思考题]poj1160 Post Office

2021/3/25,今天做了个很难的区间dp,题意如下:在n个村庄建立m个邮局,求每个村庄到邮局的最短距离总和。显然是一个dp的问题,首先我们可以思考,如果只有一个邮局的话肯定是建在所有村庄的中间位置距离最短。如果有多个的话可以把n个村庄化为m个区间,每个区间的村庄去他们中间的邮局。那么状态转移方程就出来了:dp[i][j]表示前i个村庄有j个邮局。dp[i][j]=min(dp[i][j-1]+dis[k+1][i])。其中k为假设k+1到i中有一个邮局,剩下j-1个邮局都在1到k中。所以dp[

2021-03-25 23:29:42 183

原创 [思考题]猴子的食物

2021/3/24,今天看到个面试题挺有意思的,题意如下:动物园有猴山,每天需要给猴子们发香蕉,猴子会排队依次取食。猴子们铺张浪费,会多拿食物,但最多不会拿超过自身食量的二倍且不会超过当前还存在的香蕉的一半,最后—个猴子除外(即最后—个猴子可以拿完剩余的所有香蕉)。最少需要准备多少香蕉,能保证所有猴子都能吃饱?输入每个猴子的食量,输出最少的香蕉个数。这道题乍一看没有什么思路,应该是一个dp,但是没想出来,借鉴了一下别人的思路。我们假设每个猴子需要吃的食物数量为a,吃了x的食物,剩下n的食物,那么

2021-03-24 22:47:46 616

原创 [剑指Offer]12. 整数转罗马数字

2021/3/23,今天遇到一个很有意思的题,题意如下:这道题乍一看有点蒙,但是仔细思考一下可以发现规律。和找零钱问题一样我们要尽可能的使用大面值的数字。所以我们可以用贪心算法构造数组。但是需要注意的是有几种特殊情况,比如4,9,40之类的,见下图(图片来自Leecode官方题解 )我们按照这种方法构造就可以完成罗马数字的转换了。c++参考代码:class Solution {public: string intToRoman(int num) { string str[

2021-03-23 22:25:24 82

原创 [剑指Offer]19. 删除链表的倒数第 N 个结点

2020/3/22,今天又巩固了一下自己的链表知识。题意如下:最简单的思路就是O(N2)循环两次找,但是我们能不能O(N)实现呢?思考一下我们需要循环两次的原因是链表只能向后查找,并不知道什么时候到达尾结点。那么换个思路,我们可以使用两个指针,一个指针往后跑找尾结点,另一个指针在第一个指针的前n-1个位置,那么当第一个指针到达尾结点时,第二个指针就指的是倒数第n个节点了。想清楚后代码实现就很简单。需要注意的是链表最好新建一个节点指向头结点防止只有一个节点的特殊情况,另外此题中我使用的it指针指向的是倒

2021-03-22 22:43:03 109

原创 [剑指 Offer]16. 数值的整数次方

题意如下:其实就是个快速幂,遍历方法的优化。当n为偶数时,xn=xn/2·xn/2。当n为奇数时,xn=xn/2·xn/2·n。(n/2为向下取整)此题需要注意的是当n为负时可以将x变成1/n。还有当n=-231时n=-n会爆int。c++代码如下:class Solution {public: double myPow(double x, int n) { if(x==0) return 0; long long a=n;

2021-03-21 21:33:23 40

原创 [剑指Offer]15. 二进制中1的个数

今天觉得值得记录的题是15. 二进制中1的个数,题意如下:首先最基础的思路肯定是遍历每一为,然后数1的个数。代码如下:class Solution {public: int hammingWeight(uint32_t n) { int ans=0; while(n) { ans+=n&1;//n&1如果n最后一位为1的话值为1. n>>=1;//n向右移一位

2021-03-20 23:28:46 54

原创 [剑指Offer]07. 重建二叉树

为了面试做准备!开始刷剑指Offer,今天做的值得记录的是07. 重建二叉树,题意如下:我们知道前序遍历的第一个是根节点,而中序遍历从根节点处把序列分为了左子树,根节点,右子树。所以我们可以根据前序遍历找根节点,根据中序遍历划分子树。使用递归的方法把大问题转化成为小问题。具体还有很多小细节,见代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left;

2021-03-19 19:22:08 43

原创 [每日一题]Leetcode206. 反转链表和Leetcode92. 反转链表 II

2021/3/18,Leetcode206. 反转链表题意如下:反转链表有很多种做法,可以用栈之类的操作,时间复杂度都是O(N),但是用栈会增加空间复杂度。这里我们用时间复杂度和空间复杂度都最低的双指针法。简单点说就是头插法,将每一个节点都插在当前链表的表头。说起来容易,代码实现要特别注意指针赋值的顺序。c++参考代码如下:class Solution {public: ListNode* reverseList(ListNode* head) { if(!head)

2021-03-18 20:08:28 142

原创 [每日一题]Leetcode115. 不同的子序列

今天的每日一题是Leetcode115. 不同的子序列,题意如下:字符串匹配的题我们可以想到用动态规划,两个字符串匹配的题可以用二维动态规划。我们定义dp[i][j]为:第一个字符串从0到i这个长度中第二个字符串从0到j这个长度的字符串出现的次数。 首先dp[i][0]的值肯定都为1,因为任意串都有一个空的子序列。然后我们就用两层for循环来补全这个二维数组,这样会出现两种情况:1.当前扫到的两个字符相等,那么就选择用这个字符匹配另一个字符串(dp[i+1][j+1]=dp[i][j]),也可以不用这

2021-03-17 17:45:15 95

原创 [每日一题]Leetcode59. 螺旋矩阵 II

2020/3/16,今天的每日一题是Leetcode59. 螺旋矩阵 II,题意如下:这道题和昨天的那个很像,思路也差不多。没看过的点这里《[每日一题]Leetcode54. 螺旋矩阵》。只需要自己定义一个二维数组然后按照之前的题的方向变换。数组初始值全为0,有值的说明被填过了。然后改变方向就可以了。c++代码如下:class Solution {public: vector<vector<int>> generateMatrix(int n) { int

2021-03-16 19:44:36 82

原创 [每日一题]Leetcode54. 螺旋矩阵

2021/3/15,今天的每日一题是Leetcode54. 螺旋矩阵,题目大意如下:这道题就是一个考验思路和编程基本功的问题,我们通过观察可以发现旋转的方向是固定的,并且矩阵的大小旋转一圈就少了一圈。所以我们可以通过控制矩阵的边界和方向进行输出,思路很简单,具体实现请看代码:class Solution {public: vector<int> spiralOrder(vector<vector<int>>& matrix) { int

2021-03-15 21:56:53 152 4

原创 [每日一题]Leetcode706. 设计哈希映射

2021/3/14,今天的每日一题是Leetcode706. 设计哈希映射,题意如下:和昨天的设计哈希集合类似,没有看过的可以移步《[每日一题]Leetcode705. 设计哈希集合》,区别哈希映射要存的是两个值,我们可以用pair这个数据结构实现,具体代码也差不多。c++参考代码:class MyHashMap {public: vector<list<pair<int,int>>> p; static const int mod = 977;

2021-03-14 13:42:13 91

原创 [每日一题]Leetcode331. 验证二叉树的前序序列化

2021/3/12,今天的每日一题是Leetcode331. 验证二叉树的前序序列化,题意如下:序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录例如:例如,上面的二叉树可以被序列化为字符串 “9,3,4,#,#,1,#,#,2,#,6,#,#”,其中 # 代表一个空节点。给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。每个以逗号分隔的字符或为一个整数或

2021-03-13 22:15:51 64

原创 [每日一题]Leetcode705. 设计哈希集合

今天的每日一题是Leetcode705. 设计哈希集合,题意如下:不使用任何内建的哈希表库设计一个哈希集合(HashSet)。实现 MyHashSet 类:void add(key) 向哈希集合中插入值 key 。bool contains(key) 返回哈希集合中是否存在这个值 key 。void remove(key) 将给定值 key 从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。首先我们想到的方法是用一个标记数组标记所有的数字,这种方法虽然能O(1)的实现各种操作。但是这种

2021-03-13 14:38:44 160

原创 [每日一题]Leetcode227. 基本计算器 II

今天的每日一题是Leetcode227. 基本计算器 II,题意如下:给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。1 <= s.length <= 3 * 105s 由整数和算符 (’+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开s 表示一个 有效表达式表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内题目数据保证答案是一个 32-bit 整数这道题是昨天的进阶版,但是这道题少了括号,多了乘

2021-03-11 16:46:14 406

原创 [每日一题]Leetcode224. 基本计算器

今日每日一题是Leetcode224. 基本计算器,题意如下:实现一个基本的计算器来计算一个简单的字符串表达式 s 的值。1 <= s.length <= 3 * 105s 由数字、’+’、’-’、’(’、’)’、和 ’ ’ 组成s 表示一个有效的表达式例:输入:s = “(1+(4+5+2)-3)+(6+8)”输出:23这道题虽然是个困难难度的题,但是思路却非常简单。基本上都能想到用一个栈来存表达式。因为这道题只有加减运算,只有括号是最先优先级。所以我们将表达式入栈当遇到右括

2021-03-10 17:00:34 157

原创 [每日一题]Leetcode11. 盛最多水的容器

2021/3/9今天的每日一题是Leetcode11. 盛最多水的容器,这道题曾经在某个热身赛里碰到过,当时想错了就没做出来,现在看到真是感慨良多。题意如下:给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。n = height.length2 <= n <= 3 *

2021-03-09 18:28:57 92

原创 [每日一题]Leetcode132. 分割回文串 II

2021/3/8今天的每日一题是Leetcode132. 分割回文串 II,是昨天那道题的进阶版,题意如下:给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。返回符合要求的 最少分割次数 。1 <= s.length <= 2000首先看到这个题的数据范围是2000,用昨天的方法(昨天方法的复杂度为N*2^N)肯定会超时。这道题只需要求分割次数,并不需要找出每一种分割方法,所以可以不用昨天的暴力搜索方法。可以考虑之前的求最长递增子序列的方法,没有看过的可以去瞅一眼

2021-03-08 21:02:52 85

原创 [每日一题]Leetcode131. 分割回文串

2021/3/7。今天的每日一题是Leetcode131. 分割回文串,题意如下:给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。回文串 是正着读和反着读都一样的字符串。首先要仔细读题,题目要求是将s分割成子串,注意理解题意。官方给的题解是回溯+动态规划,但是我看下来其实也就是用了个dfs,或者说是dfs本身就带有回溯的思想吧,反正对我来说把它当成dfs来好理解一些。dfs和回溯的相似之处就是都分为三步:做选择 -> 递归 ->

2021-03-07 21:51:46 220

原创 [每日一题]Leetcode496. 下一个更大元素 I和Leetcode503. 下一个更大元素 II

2021/3/6今天的每日一题是Leetcode496. 下一个更大元素 I和Leetcode503. 下一个更大元素 II,因为是同类型的题所以就放一块写了。Leetcode496. 下一个更大元素 I题意:给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在

2021-03-06 15:42:46 109

原创 [每日一题]Leetcode232. 用栈实现队列

2021/3/5今天的每日一题是Leetcode232. 用栈实现队列,美好的一天从一道简单题开始☺,题意如下:请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你

2021-03-05 13:31:05 102

空空如也

空空如也

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

TA关注的人

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