算法
zxhI2020Y
这个作者很懒,什么都没留下…
展开
-
字节跳动2021/3/23面试
1.实现一个排序算法,完成下面序列的排序!var version = [“1.34.5”, “1.23123.10”, “1.1.1”];也就是说,按照每个点对应的数字的大小进行排序,每个点的数字越大对应的数字的结果就是在后面。上面的排序之后的序列应该是:[ ‘1.1.1’, ‘1.34.5’, ‘1.23123.10’ ]实现的代码如下:使用前端的语言JavaScript实现的,重写一个sort的第三个参数函数即可!var version = ["1.34.5", "1.23123.10", "1原创 2021-03-23 20:58:09 · 104 阅读 · 0 评论 -
20213/3/20美团笔试
一共五个题目:第一题是:给定两个字符串,在第一个字符串中去匹配第二个字符串,第一个字符串可以任意重复,求出其中多余的字符个数,如下所示:str1 = abchefghijklmnopqrstuvwxystr2 = meituan比如说这里就是匹配为:abchefghijkl**m**nopqrstuvwxy abch**e**fgh**i**jklmnopqrs**tu**vwxy **a**bchefghijklm**n**opqrstuvwxy去匹配其中的meituan依次出现,你可原创 2021-03-20 19:24:58 · 400 阅读 · 2 评论 -
19. 删除链表的倒数第 N 个结点
题目大意:就是删除其中的倒数第K个节点!思路:自己想的办法是使用快慢指针来解决的,然后使用一个额外的指针来记录当前需要被删除的节点的前一个节点,但是实际上操作难度增加啦!只需要让其中的fast指针少走一步即可!这样的话slow指针当好就是到达了其中的需要被删除的前一个节点。代码如下:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * Li原创 2021-03-20 15:26:57 · 81 阅读 · 0 评论 -
54. 螺旋矩阵
螺旋矩阵:https://leetcode-cn.com/problems/spiral-matrix/题目的意思是直接螺旋的打印出对应的矩阵的内容,也就是顺时针打印出对应的矩阵的内容。大致的思路就是按照顺时针的思想,使用left、right、down、up四个变量,分别记录矩阵中的开始,每次遍历之后更新其的值,然后每次判断left和right的值的差异多大,只要是满足两者相交的时候直接返回结果即可!实现的代码如下:JavaScript语言/** * @param {number[][]} mat.原创 2021-03-15 15:34:38 · 70 阅读 · 0 评论 -
C++排序
选择排序:首先是明确一些函数:然后是弄清楚每种排序算法的思路!void swap(vector<int>a, int i, int j){int t = a[i];a[i] = a[j];a[j] = t;}简单的交换数组中的两个元素的函数实现!1.选择排序:使用下标总是从后面选择出当前最小的元素值,然后使用其的下标与当前的i的值位置的元素进行交换,记住i是最外层循环的值,所以在使用的时候必须将上线设定为:nums.size() -1的值,依次从当前的i的值后面的元素出发依次选原创 2021-02-25 11:37:13 · 368 阅读 · 0 评论 -
BFS
BFS所求得一定是最短路径,解决问题的时候只需要将对应的想为一个图即可!大致的代码框架如下:class Solution {public: int minDepth(TreeNode* root) { queue<TreeNode*>q; q.push(root); int depth = 1; if(!root) return 0; while(!q.empty()) { in原创 2021-02-23 18:17:20 · 49 阅读 · 0 评论 -
回溯算法详解
解决一个回溯问题,实际上就是一个决策树的遍历过程。相应的只是需要思考3个问题:1、路径:也就是已经做出的选择选择列表:也就是你当前可以做的选择。结束条件:到达决策树底层,无法再次继续选择的时候result = []def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: /就把这个当成模板,然后是直接套用即可./ /做选择的时候应该防止原创 2021-02-22 22:37:38 · 127 阅读 · 0 评论 -
二分查找
二分法:思想是非常简单的,但是细节的地方还是比较困难,很多不同的情况下使用不一样的实现。left = 0 left的值都是初始化为:0代码模块如下:int binarySearch(vector<int>nums, int target) { int left = 0, right = ...; while(...) { int mid = (left + right ) / 2; if(nums[mid] == target) { ...; } else if(n原创 2021-02-21 20:46:42 · 68 阅读 · 0 评论 -
双指针总结
双指针:可以将其分成快慢指针和左右指针,两者有不一样的应用场景。快慢指针:主要是用于一些判断链表问题的,比如说判断当前的链表是否包含有环存在,这些题目往往使用单个指针是很难解决的。//判断当前的链表是否有环struct ListNode{ struct ListNode *next; int val};bool hasCycle(ListNode* head){ ListNode fast, slow; fast = slow = head; while(fast != NULL &a原创 2021-02-19 15:31:26 · 152 阅读 · 0 评论 -
树的子结构
题目如下:题目的目的:也就是判断对应的B树是否是A树的子树,只要是其中的B树是其中的A树的一部分即可!解题思路:应该从根节点出发,依次判断当前A树中的子节点是否于其子树构成了对应的于B完全相同的结果。即首先先序遍历对应的A树,进行判断当前的节点和子树是否跟其中的B的结构完全相同。另外实现一个函数判断当前的B树的结果与A树的子节点的是否相同即可!class Solution {public: bool isSubStructure(TreeNode* A, TreeNode* B) {原创 2021-02-17 16:45:06 · 50 阅读 · 0 评论 -
最大二叉树
题目大意:总是按照当前数组或者子数组中的元素值的最大值作为根节点,依次创建一颗二叉树。输入:nums = [3,2,1,6,0,5]输出:[6,3,5,null,2,0,null,null,1]解释:递归调用如下所示:- [3,2,1,6,0,5] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5] 。 - [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1] 。 - 空数组,无子节点。 - [2,1] 中的最大原创 2021-02-15 20:15:44 · 204 阅读 · 0 评论 -
二叉树展开为链表
题目大意:将对应的二叉树转换为单链表,对应的单链表的顺序是符合前序遍历的方式的,求解的时候也只是需要首先将对应的先求出先序遍历之后,然后依次将左指针转换为NULL,右指针指向下一个节点。实现的代码如下:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0)原创 2021-02-07 21:57:50 · 106 阅读 · 0 评论 -
二叉树的层次遍历
题目大意:就是将二叉树每一层的节点内容反向输出! 在实现的时候可以直接使用层次遍历的方式即可,然后将层次遍历的结果进行一个逆转。因为在C++语言中的 vector的容器在这方面上使用起来非常方便。 层次遍历的实现是非常简单,首先需要将根节点记录到队列中,然后开始遍历求解,针对于其中当前的列表的长度,每次循环全部的内容,将当前的列表的内容不是空的直接加入即可!/** * Definition for a binary tree node. * struct TreeNode { *原创 2021-02-07 21:40:35 · 199 阅读 · 0 评论 -
简单理解递归
递归:现在的一些高级语言具有着可以在函数内部调用函数自身的功能,在一些场合中可以完成简化代码实现!下面简单的讲一下自己对于递归的理解!递归的实现一般分为三个步骤:在代码实现的时候一般需要按照这个步骤实现。明确递归函数的作用递归的终止条件找到关系式,让其最终可以达到递归的终止条件!下面详细讲解一下需要如何操作!首先明确函数的作用:例如拿对应的斐波那契数列而言,问题就是需要求解处对应的数列让其满足当前的下标值n>3的情况下,当前下表对应的函数值是前两者的函数的之和。当 1 1 2 3 5原创 2021-02-06 12:15:58 · 88 阅读 · 0 评论