![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
坐飞机的狗
熟悉java技术,熟悉java常用设计模式,熟悉java高并发程序设计,了解jvm调优;熟悉基于spring boot+Mybatis的网站后端开发;了解go web开发,熟悉基于RPC + go 微服务开发;熟悉python常用的数据分析库(pandas\sklearn\tensorflow等)、爬虫框架(scrapy)、django后端开发;熟悉mysql的使用;了解前端HTML+CSS+Javascript;了解常用的机器学习算法;熟悉git常用操作。
展开
-
字符串匹配--sunday算法
实现 strStr() 函数。给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。输入:haystack = “hello”, needle = “ll”输出:2class Solution { public int strStr(String haystack, String needle) { // 各种边界情况 if (.转载 2021-07-26 21:19:15 · 64 阅读 · 0 评论 -
leetcode 三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]class Solution { public List<List<Integer>> threeSum(int[] nums) { List<.原创 2021-07-24 23:41:15 · 81 阅读 · 0 评论 -
数组常用方法
二分法使用二分查找法的前提是数组中无重复元素写二分法,区间一般为2种:[left, right] 或者 [left, right)定义区间[left, right]while(left <= right)当nums[mid] > target时,说明target在[left, mid - 1]之间当nums[mid] < targe时,说明target在[mid + 1, right]之间当nums[mid] == target时,return mid;模板代码原创 2021-07-17 22:05:58 · 101 阅读 · 2 评论 -
设计LRU缓存结构
题目描述设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能set(key, value):将记录(key, value)插入该结构get(key):返回key对应的value值[要求]set和get方法的时间复杂度为O(1)某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。若opt=1,接下来两个整数x, y,表示set(x, y)若opt=2,接下来一个整数x,.转载 2021-04-29 16:37:03 · 75 阅读 · 0 评论 -
距离总和
给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。叶子节点 是指没有子节点的节点。示例 1:输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true示例 2:输入:root = [1,2,3], targetSum = 5输出:false示例 3:输入:root = [1原创 2021-04-27 21:37:57 · 61 阅读 · 0 评论 -
机器人的运动范围
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?我们将行坐标和列坐标数位之和大于k的格子看作障碍物,那么这道题就是一道很传统的记忆搜索题目...转载 2021-04-05 15:34:33 · 80 阅读 · 0 评论 -
字符串的交错组成
给定三个字符串str1、str2和aim,如果aim中属于str1的字符之间保持原来在str1中的顺序,对于str2也是如此,那么称aim是str1和str2的交错组成。eg:str1 = "AB" str2 = "12"。那么"AB12",“A1B2”,“A12B”,“1A2B”等都是str1与str2的交错组成。public class Solution { public static boolean isCross1(String str1, String str2, S...原创 2021-03-31 15:28:27 · 213 阅读 · 0 评论 -
最小编辑代价
给定两个字符串str1和str2,再给定三个整数ic,dc和rc,分别代表插入、删除和替换一个字符的代价,返回将str1编辑成str2的最小代价。eg:str1="abc",str2="adc",ic = 5,dc = 3,rc = 2从"abc"编辑成"adc",把'b'替换成'd'是代价最小的,所以返回2./** * 最小编辑代价 */public class Solution10 { // 经典动态规划 public static int minCost1(.原创 2021-03-29 14:25:28 · 242 阅读 · 0 评论 -
滑动窗口
给定一个字符串,找出其中不包含重复字符的最长子串的长度。输入:s = "abcabcbb"输出:3解释:其中不含有重复字符的最长子串是“abc”,所以其长度为3思路:进入这个队列(窗口)为abc满足题目要求,当再进入a,队列变成abca,这时候不满足要求。此时将队列最左边的元素移除,直到满足题目要求。一直维持这样的队列,找出队列出现最长的长度的时候,求出解。时间复杂度:O(n)class Solution{ public int lengthOfLongestSubstring.原创 2021-03-23 15:14:49 · 67 阅读 · 0 评论 -
最长公共子串问题
给定两个字符串str1和str2,返回两个字符串的最长公共子串str1="1AB2345CD" str2="12345EF" 返回"2345"1. 定义状态数组dp[i][j]表示是:把str1[i]和str2[j]当作公共子串最后一个字符的情况下,公共子串最长能有多长。注意:此时的str1[i]与str2[j]就是此时比较的子串而不是要去拆分的子串。例如str1 = "A1234B" str2="CD1234",dp[3][4]即: str1[3] = "A12E"与str2[4]=".原创 2021-03-23 13:10:57 · 319 阅读 · 0 评论 -
最长递增子序列
给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。输入:nums=[10, 9, 2, 5, 3, 7, 101, 18]输出: 4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。class Solution { public int lengthOfLIS(int[] nums) { .原创 2021-03-10 19:31:16 · 85 阅读 · 0 评论 -
换钱的方法数
给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱的方式数。一、暴力递归public static int coins1(int[] arr, int aim){ // 排除极端条件 if (arr == null || arr.length == 0 || aim < 0){ return 0; } .原创 2021-03-10 14:42:18 · 442 阅读 · 1 评论 -
回溯算法
解决一个回溯问题,实际上就是一个决策树的遍历过程,需要考虑的三个问题:路径:也就是已经做出的选择。 选择列表:当前可以做的选择。 结束条件:到达决策树底层,无法再做出选择条件。回溯算法的框架:result = []def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择 backtrack(路径,选择列表原创 2021-03-01 14:37:08 · 152 阅读 · 2 评论 -
链表中的重用代码
一、设置假头结点解决链表头结点被替代的问题203移除链表元素合并两个链表二、一些总结1.同时使用多个指针有些问题需要跟踪多个结点,需要记住跟踪哪些结点。2.记住前面的节点由于无法追溯链表中的前一个节点,因此需要存储前一个节点。...原创 2021-02-25 20:32:56 · 72 阅读 · 0 评论 -
反转链表(单向链表、双向链表和部分链表)
链表题一般需要两个指针:public class Node{ public int value; public Node next; public Node(int value){ this.value = data; }}public class DoubleNode{ public int value; public DoubleNode last ; // 指向上个节点 public DoubleNode n原创 2021-01-28 16:31:57 · 117 阅读 · 0 评论 -
删除a/b处的节点
链表:1->2->3->4->5,假如a/b的值为r。如果r等于0,不删除任何节点;如果r在区间(0, 1/5]上,删除节点1;如果r在区间(1/5, 2/5]上,删除节点2;如果r在区间(2/5, 3/5]上,删除节点3;如果r在区间(3/5, 4/5]上,删除节点4;如果r在区间(4/5, 1]上,删除节点5;如果r大于1,不删除任何节点;删除链表的问题一般需要分情况讨论,1)删除头节点;2)删除非头节点。package 链表问题;/** * .原创 2021-01-28 12:28:39 · 120 阅读 · 0 评论 -
在单链表和双链表中删除倒数第K个节点
分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点。public static Node removeLastKthNode(Node head, int lastKth){ if (head == null || lastKth < 1){ return head; } Node cur = head; // 第一遍移动 while(cur != nu原创 2021-01-22 20:50:48 · 186 阅读 · 0 评论 -
奇偶链表
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。把一个链表分成两个链表然后合起来1.边界条件–如果链表为空,则直接返回链表。2.第一个节点为奇数链表的头结点3.第二个节点为偶数链表的头结点4.两者交替前进,但是注意每一步首先更新奇数节点,然后更新偶数节点。5.合并两个链表–两个引用而已// Example: 1,2,3,4,5,6,7,8class Solution { public List.转载 2021-01-06 20:24:56 · 152 阅读 · 0 评论 -
链表中的双指针总结
链表中的双指针问题:// 初始化快慢指针ListNode slow = head;ListNode fast = head;/*** 对于每个问题具体改变* 注意避免空指针异常**/while (slow != null && fast != null && fast.next != null) { slow = slow.next; // 每次移动慢指针一步 fast = fast.next.next; ...原创 2020-12-24 21:14:23 · 723 阅读 · 1 评论 -
floyd判圈算法
经典的三个问题:1.如何判断是否有环?如果有两个头结点指针,一个走的快,一个走的慢,那么若干步以后,快的指针总会超过慢的指针一圈。2.如何计算环的长度?第一次相遇(超一圈)时开始计数,第二次相遇时停止计数。3.如何判断环的入口点:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。...原创 2020-12-22 16:28:23 · 210 阅读 · 0 评论 -
动态规划总结
动态规划题目特点:计数类求最大最小值类求存在性类原创 2020-12-22 10:10:48 · 158 阅读 · 0 评论 -
二叉树深度优先广度优先算法
1. 深度优先算法class Solution{ public List<List<Integer>> levelOrder(TreeNode root){ List<List<Integer>> result = new ArrayList<>() ; if (root != null){ // 如果这是一个空的二叉树 dfs(result, root, 0) ;原创 2020-11-22 19:37:46 · 389 阅读 · 0 评论