
数据结构与算法
javafanwk
专注微服务架构,熟悉react、大数据、云计算,喜欢看java编程思想,设计模式,算法等书,希望通过我的努力减少代码量,提高java的标准化,提高程序的稳定度,认真搞技术,一直在路上,希望大家共同前行,进步。。。
展开
-
hashmap源码中tableSizeFor()解释n >>>1操作
通过tableSizeFor(cap)计算出不小于initialCapacity的最近的2的幂作为初始容量,将其先保存在threshold里/** * @description HashMap扩容测试 * << : 左移运算符,num << 1,相当于num乘以2 * >> : 右移运算符,num >> 1,相当于num除以2 * >>> : 无符号右移,忽略符号位,空位都以0补.原创 2021-12-26 20:02:58 · 328 阅读 · 0 评论 -
定义字符串的左旋转操作,把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab,请实现字符串左旋转函数。
定义字符串的左旋转操作,把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab,请实现字符串左旋转函数。要求时间复杂度O(n),空间复杂度O(1).解法1是将前k个字符串反转,后面的字符串同样反转,再对整个字符串进行一次翻转。解法2如下public class Rotate { public static String rotate(String s, int leftSize) { char[] chars = s.t原创 2021-12-26 12:59:46 · 643 阅读 · 0 评论 -
给定一个数组arr,返回子数组的最大累加和
给定一个数组arr,返回子数组的最大累加和public class MaxSum { public static int maxSum(int[] arr) { int max = Integer.MIN_VALUE; int cur = 0; for (int i = 0; i < arr.length; i++) { cur = cur + arr[i]; max = Math.m原创 2021-12-26 11:50:03 · 205 阅读 · 0 评论 -
长度为N的数组arr,一定可以组成N^2个数字对。例如arr = [3,1,2],数字对有(3,3) (3,1) (3,2) (1,3) (1,1) (1,2) (2,3) (2,1) (2,2)
长度为N的数组arr,一定可以组成N^2个数字对。例如arr = [3,1,2],数字对有(3,3) (3,1) (3,2) (1,3) (1,1) (1,2) (2,3) (2,1) (2,2),也就是任意两个数都可以,而且自己和自己也算数字对,数字对怎么排序?第一维数据从小到大;第一维数据一样的,第二维数组也从小到大,所以上面的数值对排序的结果为:(1,1)(1,2)(1,3)(2,1)(2,2)(2,3)(3,1)(3,2)(3,3)。给定一个数组arr,和整数k,返回第k小的数值对。.原创 2021-12-25 22:04:59 · 570 阅读 · 0 评论 -
master公式
master: T(n) = a * T(N/b) + O(N^d);当:1) log(b,a) > d 复杂度为O(N^log(b,a)) //log以b为底,a的对数2) log(b,a) = d 复杂度为O(N^d*logN)3) log(b,a) < d 复杂度为O(N^d)符合子问题规模是等规模的行为,均可使用master公式求解时间复杂度。例子:public static int[] markNo(int size) { ...原创 2021-12-25 21:17:39 · 574 阅读 · 0 评论 -
输入一个int类型的值N,构造一个长度为N的数组arr并返回
输入一个int类型的值N,构造一个长度为N的数组arr并返回要求:对任意的i < k < j,都满足arr[i] + arr[j] != arr[k] * 2public class MakeNo { /** * 思路:假定有一个数组满足上述条件,对这个数组进行奇变换和偶变换得到的数组同样符合条件, * 将奇变换和偶变换得到的数组合并到一起也是满足条件的 */ public static int[] markNo(int原创 2021-12-25 20:52:10 · 712 阅读 · 0 评论 -
LRU 最近未使用算法
LRU(Least recently used,最近未使用算法)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。链表(处理新老关系)+ 哈希(查询在不在) 整体时间复杂度可以达到O(1)import lombok.Data;import java.util.HashMap;public class LRUCache { int capacity; HashMap<Integer, Node> .原创 2021-12-25 20:03:05 · 763 阅读 · 0 评论 -
将数组转化为二叉树(递归与非递归)
class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } }一、递归的实现 @Test public void testLevel() { Integer[] arr = new Integer[]{3,9,20,null,null,15,7}; TreeNo...原创 2021-12-22 14:33:05 · 582 阅读 · 0 评论 -
二叉树层序遍历(递归与非递归)
二叉树的1>2>3>4>5>6>7 (层序遍历)offer,add 区别:一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。poll,remove 区别:remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的...原创 2021-12-23 19:57:51 · 149 阅读 · 0 评论 -
二叉树中序遍历(递归与非递归)
二叉树的 递归序1.在任何递归子树中,左节点一定在右节点之前遍历。2.前序,中序,后序,左节点一定在右节点之前遍历1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 7 3 1 递归序4>2>5>1>6>3>7 (中序遍历 左根右)递归实现 private void in_order(TreeNode root) { if (root == null) { re...原创 2021-12-23 19:38:37 · 391 阅读 · 0 评论 -
二叉树后序遍历(递归与非递归)
二叉树的 递归序1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 7 3 14>5>2>6>7>3>1 (后序遍历 左右根 取得是递归序的第一次出现的顺序)递归实现 private void pre_order(TreeNode root) { if (root == null) { return; } System.out.print(r...原创 2021-12-22 18:01:18 · 361 阅读 · 0 评论 -
二叉树前序遍历(递归与非递归)
二叉树的 递归序1.在任何递归子树中,左节点一定在右节点之前遍历。2.前序,中序,后序,左节点一定在右节点之前遍历1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 7 3 1 递归序1>2>4>5>3>6>7 (前序遍历 根左右)递归实现 private void pre_order(TreeNode root) { if (root == null) { ...原创 2021-12-23 11:40:49 · 245 阅读 · 0 评论