
数据结构与算法
阿Q咚咚咚
生活不易,唯有努力
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
经典算法汇总
一. 数组相关 二. 链表相关 三. 字符串相关 LeetCode第3题:无重复字符的最长子串 LeetCode第567题:字符串的排列 四. 二叉树相关原创 2021-08-23 18:38:53 · 763 阅读 · 0 评论 -
冒泡排序与快速排序(java实现)
冒泡排序: public class bubbleSort { public static void bubbleSort1(int [] a, int n){ int i, j; for(i=0; i<n; i++){//表示 n 次排序过程。 for(j=1; j<n-i; j++){ if(a[j-1] > a[j]){//前面的数字大于后面的数字就交换原创 2021-07-08 21:48:06 · 139 阅读 · 0 评论 -
Linux使用RSA实现免密登录(原理)
参考文献Linux密钥rsa加密原理和ssh使用密钥实现免密码登录 感谢作者分享!原创 2021-05-14 10:37:55 · 201 阅读 · 0 评论 -
有了二叉查找树、平衡树为啥还需要红黑树?
参考文章: 有了二叉查找树、平衡树为啥还需要红黑树? 漫画AVL树 谢谢作者分享!原创 2021-04-26 12:04:35 · 96 阅读 · 0 评论 -
B-TREE、B+TREE、数据库索引
推荐文章: B-Tree详解 SQL夯实基础(五):索引的数据结构 感谢作者分享!原创 2021-04-25 12:27:31 · 93 阅读 · 0 评论 -
39--打印从1到最大的n位数
1.题目描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。 示例 1: 输入: n = 1 输出: [1,2,3,4,5,6,7,8,9] 2.解题思路 class Solution { public int[] printNumbers(int n) { int end = (int)Math.pow(10,n)-1; int [] res = new int[end];原创 2020-12-23 12:32:48 · 104 阅读 · 0 评论 -
38--合并两个排序的链表
1.问题描述 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 实例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 2.解决思路 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) {原创 2020-11-19 17:27:02 · 107 阅读 · 0 评论 -
三、【Map】
主要内容 Map集合 教学目标 能够说出Map集合特点 使用Map集合添加方法保存数据 使用”键找值”的方式遍历Map集合 使用”键值对”的方式遍历Map集合 能够使用HashMap存储自定义键值对的数据 能够使用HashMap编写斗地主洗牌发牌案例 第一章 Map集合 1.1 概述 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即java.uti原创 2020-10-18 19:31:44 · 139 阅读 · 0 评论 -
二、【List、Set、数据结构、Collections】
主要内容 数据结构 List集合 Set集合 Collections 教学目标 能够说出List集合特点 能够说出常见的数据结构 能够说出数组结构特点 能够说出栈结构特点 能够说出队列结构特点 能够说出单向链表结构特点 能够说出Set集合的特点 能够说出哈希表的特点 使用HashSet集合存储自定义元素 能够说出可变参数的格式 能够使用集合工具类 能够使用Comparator比较器进行排序 第一章 数据结构 2.1 数据结构有什么用? 当你用着java里面的容器类很爽的时候,原创 2020-10-18 19:31:02 · 154 阅读 · 0 评论 -
一、【Collection、泛型】
主要内容 Collection集合 迭代器 增强for 泛型 教学目标 能够说出集合与数组的区别 说出Collection集合的常用功能 能够使用迭代器对集合进行取元素 能够说出集合的使用细节 能够使用集合存储自定义类型 能够使用foreach循环遍历集合 能够使用泛型定义集合对象 能够理解泛型上下限 能够阐述泛型通配符的作用 第一章 Collection集合 1.1 集合概述 在前面基础班我们已经学习过并使用过集合ArrayList ,那么集合到底是什么呢? 集合:集合是jav原创 2020-10-18 19:30:07 · 127 阅读 · 0 评论 -
37--计算一个字符串中每个字符出现次数
1.问题描述 需求:计算一个字符串中每个字符出现次数。 2.解题思路 获取一个字符串对象; 创建一个Map集合,键代表字符,值代表次数; 遍历字符串得到每个字符; 判断Map中是否有该键; 如果没有,第一次出现,存储次数为1;如果有,则说明已经出现过,获取到对应的值进行++,再次存储; 打印最终结果。 package com.fanxindong.map; import java.util.HashMap; import java.util.Scanner; /* 需求:计算一个字符串中每个字符出现原创 2020-10-18 13:49:13 · 354 阅读 · 0 评论 -
36--斐波那契数列
1. 问题描述 写一个函数,输入n,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。 示例 1: 输入:n = 2 输出:1 示例 2: 输入:n = 5 输出:5 2. 解题思原创 2020-10-15 12:38:14 · 531 阅读 · 0 评论 -
35--用两个栈实现队列
1.问题描述 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 示例 1: 输入:[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”] [[],[3],[],[]] 输出:[null,null,3,-1] 示例 2: 输入:[“CQueue”,“deleteHead”,“appendTail原创 2020-10-14 19:38:03 · 133 阅读 · 0 评论 -
34--替换空格
1.问题描述 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 示例 1: 输入:s = “We are happy.” 输出:“We%20are%20happy.” 2.解题思路 由于每次替换从 1 个字符变成 3 个字符,使用字符数组可方便地进行替换。建立字符数组地长度为 s 的长度的 3 倍,这样可保证字符数组可以容纳所有替换后的字符。 1.获得 s 的长度 length 2.创建字符数组 array,其长度为 length * 3 3.初始化 size 为 0,size 表示替换后的字符原创 2020-10-13 17:40:25 · 176 阅读 · 0 评论 -
33--二维数组中的查找
1.问题描述 在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 示例: 现有矩阵 matrix 如下: [ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]] 给定 target = 5,返回 true。 给定原创 2020-10-12 12:43:11 · 172 阅读 · 0 评论 -
32--数组中重复的数字
1. 问题描述 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1: 输入:[2, 3, 1, 0, 2, 5, 3] 输出:2 或 3 2. 解题详情 由于只需要找出数组中任意一个重复的数字,因此遍历数组,遇到重复的数字即返回。为了判断一个数字是否重复遇到,使用集合存储已经遇到的数字,如果遇到的一个数字已经在集合中,则当前的数字是重复数字原创 2020-10-10 12:47:58 · 211 阅读 · 0 评论 -
31-- 二叉搜索树的范围和
文章目录1.问题描述2.代码详情 1.问题描述 给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和。 二叉搜索树保证具有唯一的值。 示例 1: 输入:root = [10,5,15,3,7,null,18], L = 7, R = 15 输出:32 示例 2: 输入:root = [10,5,15,3,7,13,18,1,null,6], L = 6, R = 10 输出:23 2.代码详情 解题思路(递归纯遍历,通过) 1.遍历所有节点,当节点的值在[L,R]之中时,加起来,否原创 2020-09-15 22:15:18 · 116 阅读 · 0 评论 -
30-- 返回倒数第 k 个节点
文章目录1.问题描述2.代码详情 1.问题描述 实现一种算法,找出单向链表中倒数第 k 个节点。返回该节点的值。 输入: 1->2->3->4->5 和 k = 2 输出: 4 2.代码详情 设置快和慢两个指针,初始化时快指针比慢指针多走k-1步,然后两个指针每次都走一步,当快指针到达终点时,慢指针正好处在倒数第k的位置 java: /** * Definition for singly-linked list. * public class ListNode { *原创 2020-09-07 19:56:37 · 151 阅读 · 0 评论 -
29--反转字符串
文章目录1.问题描述2.代码详情 1.问题描述 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。 示例 1: 输入:[“h”,“e”,“l”,“l”,“o”] 输出:[“o”,“l”,“l”,“e”,“h”] 示例 2: 输入:[“H”,“a”,“n”,“n”,“a”,“h”] 输出:[“h”,“a”原创 2020-07-28 17:49:06 · 124 阅读 · 0 评论 -
28--仅仅反转字母
文章目录1.问题描述2.代码详情 1.问题描述 给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。 示例 1: 输入:“ab-cd” 输出:“dc-ba” 示例 2: 输入:“a-bC-dEf-ghIj” 输出:“j-Ih-gfE-dCba” 示例 3: 输入:“Test1ng-Leet=code-Q!” 输出:“Qedo1ct-eeLg=ntse-T!” 2.代码详情 方法 :字母栈 将 s 中的所有字母单独存入栈中,所以出栈等价于对字母反序操作。(原创 2020-07-28 08:58:09 · 273 阅读 · 0 评论 -
27--字符串相加
文章目录1.问题描述2.代码详情 1.问题描述 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。 注意: num1 和num2 的长度都小于 5100. num1 和num2 都只包含数字 0-9. num1 和num2 都不包含任何前导零。 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。 2.代码详情 解题思路: 算法流程: 设定 i,j 两指针分别指向 num1,num2 尾部,模拟人工加法; 计算进位: 计算 carry = tmp //原创 2020-07-22 13:29:21 · 176 阅读 · 0 评论 -
26-- 转换成小写字母
文章目录1.问题描述2.代码详情 1.问题描述 实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。 示例 1: 输入: “Hello” 输出: “hello” 示例 2: 输入: “here” 输出: “here” 示例 3: 输入: “LOVELY” 输出: “lovely” 2.代码详情 java: class Solution { public String toLowerCase(String str){原创 2020-07-20 16:59:41 · 232 阅读 · 0 评论 -
25--最后一个单词的长度
文章目录1.问题描述2.代码详情 1.问题描述 给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。 如果不存在最后一个单词,请返回 0 。 说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。 示例: 输入: “Hello World” 输出: 5 2.代码详情 class Solution { public int lengthOfLastWord(String s) {原创 2020-07-20 12:38:23 · 111 阅读 · 0 评论 -
24--反转字符串中的单词 III
文章目录1.问题描述2. 代码详情 1.问题描述 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 示例 1: 输入: “Let’s take LeetCode contest” 输出: “s’teL ekat edoCteeL tsetnoc” 注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。 2. 代码详情 java: public class Solution { public String reverseWords(Strin原创 2020-07-19 11:06:45 · 128 阅读 · 0 评论 -
23--有效的括号
文章目录1.题目详情2.代码详情 1.题目详情 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 示例 1: 输入: “()” 输出: true 示例 2: 输入: “()[]{}” 输出: true 示例 3: 输入: “(]” 输出: false 2.代码详情 python: class Solution(object): def原创 2020-07-17 22:58:05 · 201 阅读 · 0 评论 -
22--删除字符串中的所有相邻重复项
文章目录1. 题目要求2.代码详情 1. 题目要求 给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 示例: 输入:“abbaca” 输出:“ca” 解释: 例如,在 “abbaca” 中,我们可以删除 “bb” 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa” 可以执行重复项删除操作,所以最原创 2020-07-15 12:45:03 · 677 阅读 · 0 评论 -
21--最小栈
文章目录1.问题描述2. 代码详情 1.问题描述 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) —— 将元素 x 推入栈中。 pop() —— 删除栈顶的元素。 top() —— 获取栈顶元素。 getMin() —— 检索栈中的最小元素。 示例: 输入: [“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”] [[],[-2],[0],[-3],[],[],[],[]] 输出:原创 2020-07-14 12:43:27 · 158 阅读 · 0 评论 -
20--两个数组的交集
文章目录1.问题描述2.代码详情 1.问题描述 给定两个数组,编写一个函数来计算它们的交集。 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2] 示例 2: 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 2.代码详情 class Solution: def set_intersection(self,set1,set2):原创 2020-07-10 13:36:47 · 153 阅读 · 0 评论 -
19--两数之和
文章目录1.题目要求2.代码详情 1.题目要求 2.代码详情 暴力求解: class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: for i in range(len(nums)): for j in range(i+1,len(nums)): if nums[i]+nums[j]==target:原创 2020-07-08 19:01:03 · 146 阅读 · 0 评论 -
18--两数之和 II - 输入有序数组
文章目录1.问题描述2.解题代码 1.问题描述 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。 说明: 返回的下标值(index1 和 index2)不是从零开始的。 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。 示例: 输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标原创 2020-07-08 12:48:26 · 219 阅读 · 0 评论 -
17--合并两个有序数组
文章目录1.问题描述2.代码实现 1.问题描述 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。 示例: 输入: nums1 = [1,2,3,0,0,0], m = 3 nums2 = [2,5,6], n = 3 输出: [1,2,2,原创 2020-07-07 16:56:27 · 214 阅读 · 0 评论 -
16 --删除排序数组中的重复项
文章目录1.问题描述2.代码实现 1.问题描述 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 示例 1: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 你不需要考虑数组中超出新长度后面的元素。 示例 2: 给定 nums = [0,0,1,1,1,2,2,3,3,4], 函数原创 2020-07-07 12:34:01 · 119 阅读 · 0 评论 -
15--0~n-1中缺失的数字
文章目录1. 问题描述2. 解题代码 1. 问题描述 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。 示例 1: 输入: [0,1,3] 输出: 2 示例 2: 输入: [0,1,2,3,4,5,6,7,9] 输出: 8 限制: 1 <= 数组长度 <= 10000 2. 解题代码 class Solution: def missingNumber(self, nums原创 2020-07-06 13:29:35 · 195 阅读 · 0 评论 -
14--用两个栈实现队列
文章目录1.题目详情2.解题代码 1.题目详情 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 示例 1: 输入: [“CQueue”,“appendTail”,“deleteHead”,“deleteHead”] [[],[3],[],[]] 输出:[null,null,3,-1] 示例 2: 输入: [“CQueue”,“dele原创 2020-06-30 23:30:13 · 151 阅读 · 0 评论 -
13--长度最小的子数组
文章目录1.题目要求2.解题代码 1.题目要求 给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组,并返回其长度。如果不存在符合条件的连续子数组,返回 0。 示例: 输入:s = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的连续子数组。 2.解题代码 定义两个指针 start 和 end 分别表示子数组的开始位置和结束位置,维护变量sum 存储子数组中的元素和(即从 nums[start] 到原创 2020-06-28 23:29:08 · 142 阅读 · 0 评论 -
12-- 缺失的第一个正数
文章目录1.问题描述2.解题代码 1.问题描述 给你一个未排序的整数数组,请你找出其中没有出现的最小的正整数。 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8,9,11,12] 输出: 1 提示: 你的算法的时间复杂度应为O(n),并且只能使用常数级别的额外空间。 2.解题代码 class Solution: def firstMissingPositive(self, nums: List[int]) ->原创 2020-06-28 00:09:40 · 132 阅读 · 0 评论 -
11--移除重复节点
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。 示例1: 输入:[1, 2, 3, 3, 2, 1] 输出:[1, 2, 3] 示例2: 输入:[1, 1, 1, 1, 2] 输出:[1, 2]原创 2020-06-27 00:07:32 · 184 阅读 · 0 评论 -
数据结构与算法--10.利益最大值
1.题目 亚马逊是一家纳斯达克上市的公司,通过其财务报表我们可以解读它在给定时期内的股票走势信息。这些信息包括每天交易的最高价,最低价以及开盘价。假定你作为交易员,必须在股票开盘的时候做出买入或者卖出的决定。你负责设计一个算法,根据给定的股票价格走势信息,决定买入和卖出策略,该策略保证的交易获得最大的利润 2.代码(Python) S = [2,4,1,7,9,3,5,8] # 买的天数 buyDay = 0 # 卖的天数 salDay = 0 # 收益最大值 Profit = 0 # 买入的最小价格 mi原创 2020-06-08 12:43:33 · 395 阅读 · 0 评论 -
数据结构与算法--9.常见时间复杂度及其之间的关系
文章目录1.常见时间复杂度2.常见时间复杂度之间的关系 1.常见时间复杂度 2.常见时间复杂度之间的关系原创 2020-06-07 15:40:57 · 288 阅读 · 0 评论 -
数据结构与算法--8.二叉树的基础知识
文章目录一. 二叉树基本概念二. 二叉树的性质三. 二叉树的代码实现四. 二叉树的遍历 一. 二叉树基本概念 二. 二叉树的性质 三. 二叉树的代码实现 四. 二叉树的遍历原创 2020-06-02 23:53:02 · 199 阅读 · 1 评论