数据结构与算法
汤愈韬
沉默是金
展开
-
涉及位运算符的操作的算法
涉及位运算符的操作的算法题目一:如何不用额外变量就交换两个数的值题目二: 一个数组中只有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这种树题目三:怎么把一个int类型的数,提取出最右侧的1来题目四:一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数异或运算 : 相同为0,不同为1 – 记成无进位相加同或运算 : 相同为1,不同为06 ^ 7 = 1110 ^ 111 (二进制)----------001 (无进位相加)异或预算的性质1) 0 ^原创 2020-11-30 17:58:10 · 249 阅读 · 0 评论 -
反转单向和双向链表
【题目】 分别实现反转单向链表和反转双向链表的函数。 【要求】 如果链表长度为N,时间复杂度要求为O(N),额外空间 复杂度要求为O(1)package basic_class_03;/** * 反转单向和双向链表 * 【题目】 分别实现反转单向链表和反转双向链表的函数。 * 【要求】 如果链表长度为N,时间复杂度要求为O(N),额外空间 复杂度要求为O(1) * * ...原创 2018-07-30 11:29:53 · 241 阅读 · 0 评论 -
旋转正方形矩阵 【题目】 给定一个整型正方形矩阵matrix,请把该矩阵调整成 顺时针旋转90度的样子。
只需要保证边界上的位置变化不会乱,那么里面的元素位置也不会乱需要打印一个点,如何找到其他的三个点,进行位置的变化,具体如何找到其他的三个点,就看你的coding能力了package basic_class_03;/** * 旋转举证 * * @author lenovo */public class Code_05_RotateMatrix_1 { public ...原创 2018-07-30 10:49:26 · 733 阅读 · 0 评论 -
转圈打印矩阵 -- 作者分析【题目】 给定一个整型矩阵matrix,请按照转圈的方式打印它
package basic_class_03;/** * 转圈打印矩阵: * 思路: 如果只是从局部去求解,考虑下标识如何变换的,那么这个题目算是写废了 * 这道题目锻炼的是一种宏观的的调度能力,不要限制在局部上 * 当然角标如何变幻的细节 以及边际还得自己去扣 * @author lenovo * */public class Code_06_PrintMatrixSpira...原创 2018-07-30 09:53:17 · 859 阅读 · 0 评论 -
猫狗队列问题 -- 基本算法 包含作者分析过程
package basic_class_03;import java.util.LinkedList;import java.util.Queue;/** * 猫狗队列 : * 用户可以调用add方法将cat类或dog类的 实例放入队列中; * 用户可以调用pollAll方法,将队列中所有的实例按照进队列 的先后顺序依次弹出; * 用户可以调用pollDog方法,将队列中...原创 2018-07-30 09:32:17 · 463 阅读 · 0 评论 -
如何仅用队列结构实现栈结构? 如何仅用栈结构实现队列结构?
package basic_class_03;import java.util.LinkedList;import java.util.Queue;import java.util.Stack;/** * * 如何仅用队列结构实现栈结构? * 如何仅用栈结构实现队列结构? * @author lenovo * */public class Code_03_StackA...原创 2018-07-29 10:17:27 · 316 阅读 · 0 评论 -
实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返 回栈中[最小元素]的操作。
package basic_class_03;import java.util.Stack;/** * 实现一个特殊的栈,在实现栈的基本功能的基础上, * 再实现返 回栈中[最小元素]的操作。 * * 下面的两种实现方法几乎是一样的 * * @author lenovo * */public class Code_02_GetMinStack { pub...原创 2018-07-29 10:16:24 · 234 阅读 · 0 评论 -
用数组结构实现大小固定的队列和栈
package basic_class_03;/** * 数组实现栈跟队列 * @author lenovo * */public class Code_01_Array_To_Stack_Queue_1 { /** * 队列是先进后出 * 所以获取元素的指针只需要size就行 * @author lenovo * */ ...原创 2018-07-29 10:15:31 · 372 阅读 · 1 评论 -
求小和 --- 这个题目由于笔者太饿了,所以分析过程比较简便 以后有时间补上
package basic_class_01;/** * 求小和问题 : 找出左边 比 右边 元素 小的所有 元素之后 * @author lenovo * */public class Code_12_SmallSum { /** * * * 求小和问题 * * * @param arr...原创 2018-07-29 09:21:27 · 271 阅读 · 0 评论 -
判断一个链表是否为回文结构 -- 三种实现方式 -- 由易到难
package basic_class_03;import java.util.Stack;/** * 判断一个链表是否为回文结构 * @author lenovo * */public class Code_11_IsPalindromeList { public static class Node { public int value; ...原创 2018-07-30 16:19:35 · 493 阅读 · 0 评论 -
“之”字形打印矩阵 -- 包含作者的分析思路
package basic_class_03;/** * "之" 字型 打印矩阵 * @author lenovo * */public class Code_08_ZigZagPrintMatrix { public static void printMatrixZigZag(int[][] martix) { int tR = 0; i...原创 2018-07-30 12:08:05 · 328 阅读 · 0 评论 -
将单向链表按某值划分成左边小、中间相等、右边大的形式 -- 两种方法 -- 有少许作者分析
package basic_class_03; /** * 将单向链表按某值划分成左边小、中间相等、右边大的形式 * @author lenovo * */ public class Code_12_SmallerEqualBigger {public static class Node { public int value; public Node nex...原创 2018-07-30 18:53:21 · 362 阅读 · 0 评论 -
将句子按照单词反转
例子: Hello, how are you? Fine. 反转成: Fine. you? are how Hello,注意反转的时候,你无法确定句子中到底有多少个空格,所以你使用字符串切割的话,那么你就不发还原原始字符串的空格了下面的代码是用Python写的def reverse(str_list, start, end): while start <...原创 2018-12-19 10:01:24 · 1009 阅读 · 0 评论 -
并查集理解
package basic_class_04;import java.util.HashMap;import java.util.List;/** * 并查集: * 在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合 * 然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。 * * 并查集是...原创 2018-10-20 10:25:25 · 192 阅读 · 0 评论 -
Manacher算法求解字符串的最长回文子串
package jinjie_class_01;import java.util.Arrays;/** * Manacher算法 * @author lenovo * */public class Code_04_Manacher { public static char[] manacherString(String str) { char[] ch...原创 2018-08-25 10:19:47 · 191 阅读 · 0 评论 -
KMP算法
package jinjie_class_01;public class Code_01_KMP { public static int getIndexOf(String s, String m) { if(s == null || m == null || m.length() < 1 || s.length() < m.length()) { ...原创 2018-08-09 18:37:07 · 124 阅读 · 0 评论 -
二叉树的序列化与反序列化 -- 两种实现
package class_04;import java.util.LinkedList;import java.util.Queue;public class Code_04_SerializeAndReconstructTree { public static class Node { public int value; public Nod...原创 2018-07-31 12:26:07 · 271 阅读 · 0 评论 -
在二叉树中找到一个节点的后继节点
package basic_class_04;/** * 在二叉树中找到一个节点的后继节点 * 该结构比普通二叉树节点结构多了一个指向父节点的parent指针。 * 假 设有一 棵Node类型的节点组成的二叉树,树中每个节点的parent指针 都正确地指向 自己的父节点,头节点的parent指向null。 * 只给一个在 二叉树中的某个节点 node,请实现返回node的后继节点的函数...原创 2018-07-31 10:10:45 · 254 阅读 · 0 评论 -
两个单链表相交的一系列问题
【题目】在本题中,单链表可能有环,也可能无环。给定两个 单链表的头节点 head1和head2,,这两个链表可能相交,也可能 不相交。请实现一个函数, 如果两个链表相交,请返回相交的 第一个节点;如果不相交,返回null 即可.要求:如果链表1 的长度为N,链表2的长度为M,时间复杂度请达到 O(N+M),额外 空间复杂度请达到O(1)。这个问题是比较复杂了,在代码里面分析不太清,得...原创 2018-07-30 21:18:20 · 194 阅读 · 0 评论 -
复制含有随机指针节点的链表
package basic_class_03;import java.util.HashMap;import java.util.Map;/** * 复制含有随机指针节点的链表 * Node类中的value是节点值, * next指针和正常单链表中next指针的意义 一 样, * 都指向下一个节点, * rand指针是Node类中新增的指针, * 这个指 针可 能指向链表中...原创 2018-07-30 20:19:50 · 321 阅读 · 0 评论 -
MaxGap -- 笔者代码里面有比较详细的分析,如果笔者写得比较乱,您联系笔者,笔者给您解答
问题描述:给一个没有排序的数组,当排序后找出连续两个元素之间相差最大的数,并且输出这个数。限制条件:需要在线性的时间和空间复杂度。如果数组长度小于2,则输出0。数组中的所有数为非负数。—–上代码:package basic_class_01;/** * 给定一个数组,如果排序之后,求相邻连个数的最大差值 * @author lenovo * */public ...原创 2018-07-28 20:18:53 · 459 阅读 · 1 评论 -
寻找连个有序数组A,B,两者不重复的部分
package basic_class_01;import java.util.ArrayList;import java.util.List;/** * 求出数组中所有不包含的元素 * @author lenovo * */public class Code_10_GetAllNotIncluded { /** * 两个数组都是有序的 * @p...原创 2018-07-28 18:15:34 · 344 阅读 · 0 评论 -
桶排序
package basic_class_01;import java.util.Arrays;/** * 桶排序 * @author lenovo * */public class Code_06_BucketSort { public static void bucketSort(int[] arr) { if(arr == null || arr....原创 2018-07-28 17:05:55 · 116 阅读 · 0 评论 -
两数相加:给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表
z这个算法题目就相当于是模拟了一个进位相加的算术题目,就相当于你做加法运算,但是要把做加法运算的过程用程序模拟出来:public class Two { public static ListNode addTwoNumber(ListNode l1, ListNode l2) { ListNode dumyHead = new ListNode(0); ...原创 2018-06-11 09:35:15 · 6557 阅读 · 0 评论 -
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数(同样的元素只能用一次)
解决方案*方法一:暴力法:public static int[] twoSum01(int[] nums, int target) { for(int i = 0; i &amp;amp;amp;amp;lt; nums.length; i++) { for(int j = i + 1; j &amp;amp;amp;amp;lt; nums.length; j ++) { if(nums[j] =...原创 2018-06-10 18:34:22 · 14621 阅读 · 5 评论 -
功能描述:删除字符串中字符个数最少的字符,最少字符串有多个,最少的要全部删除,然后返回该子字符串。
import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/** * 功能描述:删除字符串中字符个数最少的字符,最少字符串有多个,最少的要全部删除,然后返回该子字符串。 * @author 汤小萌 * */public class DeleteMi...原创 2018-06-07 15:51:43 · 554 阅读 · 0 评论 -
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明: 1.必须在原数组上操作,不能拷贝额外的数组。 2.尽量减少操作次数。package leetCode01;/** * 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 * 说明: * 1.必须在原数组上操作,不能拷贝额外的...原创 2018-06-14 09:58:52 · 8059 阅读 · 0 评论 -
给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组。(数组加1)
直接看代码package leetCode01;import java.util.Arrays;/** * 给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组。 * @author lenovo * */public class Demo09 { public static int[] plusOne(int[] digits) { ...原创 2018-06-14 09:42:53 · 5181 阅读 · 2 评论 -
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
import java.util.Arrays;/** * 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现[两次]。找出那个只出现了一次的元素。 * @author 汤小萌 * */public class Demo07 { // 使用异或运算符号 public static int singleNumber(int[] A) { ...原创 2018-06-12 15:31:18 · 8193 阅读 · 3 评论 -
给定一个整数数组,判断是否存在重复元素。
import java.util.Arrays;import java.util.HashMap;import java.util.HashSet;import java.util.Map;import java.util.Set;/** * 给定一个整数数组,判断是否存在重复元素。 * @author 汤小萌 * */public class Demo06 { /...原创 2018-06-12 15:04:21 · 4946 阅读 · 5 评论 -
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数
示例1:输入: [1,2,3,4,5,6,7] 和 k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]import java.util.Arrays;/** * 给定一个数组,将数组中的元素向右移动 k 个位置,...原创 2018-06-12 13:41:46 · 10050 阅读 · 3 评论 -
买卖股票的最佳时机 II
题目分析:给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。 示例1:输入: [7,1,5,3,6,4]输出: 7解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候...原创 2018-06-12 12:47:31 · 213 阅读 · 0 评论 -
36. 有效的数独(超级详细)(判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可) (特别详解)
题目描述: 判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字 是否有效即可。 1.数字 1-9 在每一行只能出现一次。 2.数字 1-9 在每一列只能出现一次。 3.数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。 要弄清楚这个问题,就是要知道验证的算法是什么.1.验证每一行上面是否出现了重复的数字...原创 2018-06-30 12:31:33 · 19573 阅读 · 7 评论 -
旋转图像
题目描述:给定一个 n × n 的二维矩阵表示一个图像。将图像顺时针旋转 90 度说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例 1:给定 matrix = [ [1,2,3], [4,5,6], [7,8,9]],原地旋转输入矩阵,使其变为:[ [7,4,1], [8,5,2],...原创 2018-07-01 17:01:39 · 158 阅读 · 0 评论 -
归并排序 --- 包含笔者的分析过程
package basic_class_01;/** * 规并排序 * @author lenovo * */public class Code_05_MergeSort { public static void mergeSort(int[] arr) { if(arr == null || arr.length < 2) { ...原创 2018-07-28 17:05:16 · 179 阅读 · 0 评论 -
快速排序 -- 包含笔者的分析过程
package basic_class_01;/** * 快速排序: * 最差时间分析:O(n^2) * 平均时间复杂度 :O(n*log2n) * 稳定度:不稳定 * 空间复杂度 :O(log2n)~O(n) * @author lenovo * */public class Code_04_QuickSort_1 { public static v...原创 2018-07-28 17:04:20 · 130 阅读 · 0 评论 -
堆排序 -- 包含笔者 呕心沥血的分析过程
package basic_class_01;/** * 堆排序 * * 最差时间分析:O(n*log2n) * 平均时间复杂度 :O(n*log2n) * 稳定度:不稳定 * 空间复杂度 :O(1) * * * 堆排序包括两个阶段,初始化建堆和重建堆。 * 初始化建堆的时间复杂度为O(n), * 排序重建堆的时间复杂度为nlog(...原创 2018-07-28 17:03:23 · 1836 阅读 · 0 评论 -
选择排序 --- 包含笔者的分析过程
package basic_class_01;/** * 选择排序: * 择排序每遍历一次都记住了当前最小(大)元素的位置, * 后仅需一次交换操作即可将其放到合适的位置。 * * * 最差时间分析:O(n^2) * 平均时间复杂度 :O(n^2) * 稳定度:稳定 * 空间复杂度 :O(1) * @author lenovo * */public c...原创 2018-07-28 17:00:56 · 176 阅读 · 0 评论 -
插入排序 -- 包含笔者的分析过程
package basic_class_01;/** * 插入排序: * 始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点就是 * 要不断地移动数据,空出一个适当的位置,把待插入的元素放到前面有序的数组中去 * * 最差时间分析:O(n^2) * 平均时间复杂度 :O(n^2) * 稳定度:稳定 * 空间复杂度 :O(1) * * * @aut...原创 2018-07-28 16:59:45 · 168 阅读 · 0 评论 -
冒泡排序 -- 包含笔者的分析过程
package basic_class_01;import java.util.Arrays;/** * 冒泡排序 * 最差 时间:O(n^2) * 平均时间复杂度 O(n^2) * 稳定度 :稳定 * 空间复杂度 :O(1) * @author lenovo * */public class Code_00_BubbleSort { public...原创 2018-07-28 16:57:53 · 892 阅读 · 1 评论