数据结构算法
micro_hz
Engineer
展开
-
退出csdn声明
鉴于csdn社区环境恶化,本人不再csdn更新文章,我活跃在B站给大家提供更多技术分享,问题与文章的阅览请移步Google与StackOverflow等优质社区。原创 2022-04-12 14:36:51 · 3233 阅读 · 11 评论 -
快手算法题LC31下一个排列
题目下一个排列实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。传送门如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1思路题目的含义很多人说读不太懂,其实我读了一遍也是似懂非懂,后来画了下图,就明白了,就是把一个数组的数字进行排列组合,可以生成n个数字,这个数原创 2020-11-10 11:07:08 · 475 阅读 · 1 评论 -
亚马逊笔试题LC57插入区间 合并区间思想
题目插入区间给出一个无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。示例 1:输入:intervals = [[1,3],[6,9]], newInterval = [2,5]输出:[[1,5],[6,9]]示例 2:输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]输出:[[1,2],[3,10],[1原创 2020-11-04 18:21:58 · 236 阅读 · 0 评论 -
字节跳动算法题LC121买卖股票的最佳时机
题目买卖股票的最佳时机给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股原创 2020-11-03 20:27:20 · 324 阅读 · 0 评论 -
LC349两个数组的交集 双指针思想
这题目来自今天的打卡题,虽然是一道简单的题目,但是可以用多种方式来解决,每种方式都有不同的侧重点,所以做一个总结。题目两个数组的交集给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[9,4]说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。思路方法1这个题目如果只是解决出来当原创 2020-11-02 14:17:01 · 265 阅读 · 0 评论 -
LC27移除元素 双索引移动
题目给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:给定 nums = [3,2,2,3], val = 3,函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,1,2,2,3,0,4原创 2020-10-30 16:45:22 · 177 阅读 · 0 评论 -
LC129算法题根到叶子节点数字之和
树的结构是面试中最常考察的一种数据结构,因为这不至于太难,又能过滤掉一批基础薄弱的面试者,所以对树的理解深度很大程度影响是否能顺利通过面试。 这次来分析一个树的经典算法题目:题目给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明: 叶子节点是指没有子节点的节点。示例 1:输入: [1,2,3]1/ 2 3输出: 25解释:原创 2020-10-29 14:15:55 · 2444 阅读 · 0 评论 -
字节跳动算法题跳跃游戏
字节跳动是比较注重算法类的题目,都必须要手撕代码的。这次遇到的题目如下:55. 跳跃游戏给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例 2:输入: [3,2,1,0,4]输出: false解释: 无论怎样,你总会到达索引为 3 的位置。原创 2020-10-27 17:51:47 · 652 阅读 · 2 评论 -
力扣今日打卡之数组的全排列
全排列 II给定一个可包含重复数字的序列,返回所有不重复的全排列。示例:输入: [1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]此题难度中等,比较中规中矩,我们很容易会想到递归+回溯的解法,就是用一个列表不断的去尝试并撤销,但是这里有个问题,就是去重。 List<List<Integer>> ansList; public List<List<Integer>> permuteUnique(int[.原创 2020-09-18 23:24:07 · 156 阅读 · 0 评论 -
算法练习总结
背景程序员都知道的方程式 程序=数据结构+算法,数据结构算法的重要性不言而喻,其揭示了程序编写的核心思想,是计算机识别程序指令的思考方式,但是大部分程序员都不会太重视这块,并非不知道其重要性,而是其在实际应用中体感想对较少,现代编程语言逐渐抽象化以及开源社区的发展屏蔽大量细节,让程序员更关注在业务逻辑与架构的思考上,站在公司和项目开发的角度,这样能快速构建商业系统,对于程序员会逐渐失去对数据结构算法的敏感度。另一方面,数据结构算法是一个十分宽泛的领域,虽然看得到的常用的结构与算法经过一定的训练可以掌握,原创 2020-09-16 14:59:04 · 219 阅读 · 0 评论 -
滑动验证码破解
背景最近有点自己空余的时间,打算利用互联网的数据做点事情,由于需要爬取一些数据,但是这个数据必须在登陆状态下才能得到,调研了很多爬虫的反爬技术的攻防,发现采用一些比较底层的爬虫框架虽然速度更快扩展性更好,但是成本比较高,因为目标网站任何改动都可以让整个爬虫崩溃,因此需要花大力气去维护,但是我的需求并不是大量数据,而是 “爬下来”,所以最后选择了selenium去进行爬取,理论上所见即所得,即所爬。关于验证码在登陆的时候,发现需要进行一个验证码的验证,验证码本质就是识别机器和人,这本身就是一个攻防战,理原创 2020-07-04 11:14:43 · 4846 阅读 · 4 评论 -
复杂链表复制
剑指offer系列还剩几道题,在毕业之前继续全部解决,这次来解决下复杂链表的复制问题。首先要理解复杂链表的意思是什么,传统的链表就是包含数据和指向下一个节点的指针,特点在于插入删除的效率比较数组高很多,复杂链表是一种包含两种指针的节点。一个指向下一个节点,另一指向一个随机节点,这个可以是你的实际情况指向的。结构如下:这个题目如下:题目给出复杂链表的结构定义如下:class RandomListNod原创 2016-05-14 13:27:19 · 414 阅读 · 0 评论 -
递归查询表结构
对于业务逻辑的编写我们大都是对于数据库表的增删改查,但是遇到特殊的查询也会涉及到算法的应用,例如在查询一个行业字典表的时候我们的需求就是要获取到整个行业的信息,这是一个典型的树形关系,节点就是Industry这个entity,它的子分类是一个list,我们可以定义这样的表结构去存储行业的信息。 最开始考虑到我们实际的应用情况貌似只有二级所以只用了两层就用了两层循环去遍历,但是后来我考虑到以后细分原创 2016-03-29 14:40:05 · 1304 阅读 · 0 评论 -
对称的二叉树
问题:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。这个问题应该是用递归的方法去解决的,但是一时半会儿没找到思路,我打算按自己的方式来解决这个问题,最开始想去求出二叉树的镜像,然后再去比较原来的树和镜像二叉树是否为同一棵树去判断是否对称,这种算法的思路比较简单但是在堆上的对象只有一棵树,去翻转了二叉树,原来的引用也指向被翻转的树,随后原创 2016-02-18 10:54:32 · 478 阅读 · 0 评论 -
孩子们的游戏(圆圈中最后剩下的数)
本题来自NowCoder网《剑指offer》: 每年六一儿童节,NowCoder都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为NowCoder的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一原创 2016-02-16 11:52:54 · 516 阅读 · 0 评论 -
字符串的排列
这个问题,难点在于两个地方。 1.如好遍历出所有的可能组合,也就是一个排列组合问题。 2.如何去控制排列顺序问题。 针对以上两个问题,我构造了两个函数,分别解决。 用递归思想去解决排列组合的问题: 传入一个list,这个list里包含了String截取前n个数字的排列组合,传入的str为截取后剩下的字符组成的字符串,这样去递归,出口是当str的长度为1返回集合。 // 递归思路原创 2016-01-26 13:39:07 · 380 阅读 · 0 评论 -
进制转换
Scanner sc = new Scanner(System.in); System.out.println("请输入一个数字"); int x = sc.nextInt(); System.out.println("请输入当前数字的进制(n>2)"); int m = sc.nextInt(); System.out原创 2016-01-06 17:31:21 · 399 阅读 · 0 评论 -
利用Java内置锁与并发包多线程交替打印字符串
最近遇到一个关于多线程的面试题感觉挺有意思的,题目是这样的:三个线程A,B,C 依次交替打印ABBCCCAAAA… 直到打印到长度为200停止,分别统计每个线程打印多少次.乍看好像并不难,但是其实涉及到的问题还是比较多的,主要就是线程间的通信。首先我们思考一下单线程的写法: // 单线程执行 int sizeA = 0; int sizeB = 0;原创 2017-03-13 17:12:42 · 1510 阅读 · 0 评论 -
插入排序二分排序冒泡排序
import java.util.Scanner;public class BinarySorted{ public static void main(String args[]){ Scanner sc = new Scanner(System.in); System.out.println("请问你要输入几个数字"); int n = sc.nextInt(); int[]原创 2016-01-07 12:15:54 · 407 阅读 · 0 评论 -
二叉搜索树与双向链表
数据结构很多算法考察当中的树就是基于一定结构下增删改查或者搜索遍历的实践。 针对这个问题: 什么是二叉搜索树,引用百科的图片: 即是左边节点的值总是小于右边的值,当然也可以反过来。总之就是按一定的规则排序好的树形结构。要将它改变成双向链表。树的问题通常都可以通过递归去解决,这个问题一样有递归的解决方案,我采用了另一种思路来解决。 因为题目的要求是不能申请额外的空间,就是不能new新的节点对象原创 2016-05-14 15:40:09 · 334 阅读 · 0 评论 -
把数组排成最小的数
关键在比较两个数字之前谁先放在前面。 public String PrintMinNumber(int [] numbers){ for(int i = 0;i < numbers.length - 1; i ++) { for(int j = 0;j < numbers.length - i - 1;j ++) { int f原创 2016-06-10 21:05:26 · 329 阅读 · 0 评论 -
正则表达式的匹配问题
这个题看似简单,但是难度不小,jdk也有实现,但是自己来造轮子发现考虑的情况非常多,这次为了这个算法思考了两三天,最后找到了解决方案如下:public boolean match(char[] str, char[] pattern) { // 反转字符数组 for (int i = str.length - 1,j = 0;j < i;i --,j ++) {原创 2016-07-20 09:05:53 · 721 阅读 · 0 评论 -
扑克牌顺子
`public class Solution { public boolean isContinuous(int [] numbers) { if (numbers.length != 5) return false; // 首先对数组进行排序(冒泡) for (int i = 0;i < numbers.length;i ++) {原创 2016-09-12 13:14:52 · 431 阅读 · 0 评论 -
堆排序
排序算法中堆排序是比较复杂的一种,因为它利用到了树结构,它是一种选择排序,与普通的选择排序不同,普通的选择是每次遍历数组去选择最大或最小的数,堆排序是利用完全二叉树结构.堆排序是一种不稳定的排序.时间复杂度为:平均O(nlog2n),最坏 O(nlog2n),最好情况 O(nlog2n),空间复杂度O(1) 排序思想:其中每个结点的关键字都不大于其孩子结点的关键字,这样的堆称为小根堆。其中每个结点原创 2017-02-22 17:57:39 · 402 阅读 · 0 评论 -
一个Linux命令Java实现
太久没写数据结构算法了,不知道是想考我数据结构还是考API的熟练程度呢。有点紧张,磕磕碰碰写完了,如果时间充足,我想把整个linux的命令的参数都放进函数参数,有限时间很多代码健壮性并没考虑到,例如流的打开关闭。 /** * 评测题目: 实现以下shell脚本的功能(不使用Stream.api, 题目中awk表示取第三列) cat /Users/micro/jyxb_gitLab/logs原创 2017-08-02 20:02:15 · 935 阅读 · 0 评论 -
【leetcode】算法系列
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2]]这个题目看似很简单,但是一旦考虑起来时...原创 2019-05-24 20:15:16 · 397 阅读 · 0 评论 -
实际项目中的算法问题
最近在做大促需求的时候,根据与产品讨论出来的一个优化方案涉及到两个个人感觉很不错的算法知识,可以简单的抽象成数据结构算法问题。特此分享一下此次实战中的一些思路。前言:一个拣货任务是仓库内分配作业人员的最小单位,即一个作业人员通过手持RF设备即可获取一个拣货任务,这个拣货任务包含多个商品,也就是一个拣货单包括多个拣货明细。这个明细主要包含信息为库位,需要拣的数量,商品名称。概念介绍:拣货任...原创 2019-06-06 08:32:01 · 1134 阅读 · 0 评论 -
利用两个栈实现队列的入队出队
import java.util.ArrayList;import java.util.Stack;/**@author:micro_hz2015年8月18日 */public class Quen { //初始化两个栈 Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new原创 2015-08-18 10:57:39 · 667 阅读 · 0 评论 -
非递归的二叉树的深度遍历
这个问题看似很简单,但是在一个多月前就开始决绝一直没想到更好的解决方案,最开始一想到树就是递归去解决,的确之前的问题都可以用递归的方案,但是深度遍历的问题始终没找到思路,尝试着用非递归的方式去解决了问题。 随便画了个图去分析这个问题。例如要深度遍历这个树,每一层封装一个节点列表,然后去遍历这个列表,然后去封装新一层的列表,同时还要替换掉原来路径列表成分支的列表。以这个树为例。 第一层为节点值原创 2016-01-02 13:30:34 · 389 阅读 · 0 评论 -
数学基础 求第k个数
因子也就是只能由这几个数字乘积得到。设计了一个递归方法,去判断这个数字是否为符合要求的数字。public int findKth(int k) { // write code here //定义一个计数器 int count = 0; for(int i = 2;count <= 100;i ++){ if(is原创 2015-10-30 15:41:46 · 455 阅读 · 0 评论 -
求出指定的位置的丑数
// 把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数, // 但14不是,因为它包含因子7。 // 习惯上我们把1当做是第一个丑数。 // 求按从小到大的顺序的第N个丑数。 public int GetUglyNumber_Solution(int index) { if(index == 1) return 1;原创 2015-11-13 11:06:42 · 370 阅读 · 0 评论 -
判断二叉树是否为子树
之前写过先序遍历和中序遍历去推导二叉树的java实现,这次是判断root2是否为root1的子树结构。我想到是用递归去解决,主要就是要解决指针(java里的引用)滑动问题和递归出口,但是题目没有明确空树是否算是子树,这几个可能性只能通过在编写完主要代码后调试命题者的意思。想到过用遍历去比较,但是并没理清思路,后来还是参考了网上的代码,用循环和递归混合去解决问题虽然代码简洁,但是理解起来还是难度比较原创 2015-09-04 12:20:06 · 2451 阅读 · 0 评论 -
反转链表
最后我的解决方案还是栈:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/import java.util.Stack;public class Solution { public ListNod原创 2015-09-01 18:31:43 · 382 阅读 · 0 评论 -
插入排序与冒泡排序集合框架实现
插入排序与冒泡排序的实现:import java.util.ArrayList;/**@author:micro_hz2015年9月2日 */public class Order { /* * 插入排序,升序 */ public static ArrayList<Integer> insertSortAsc(ArrayList<Integer> array原创 2015-09-02 15:04:06 · 474 阅读 · 0 评论 -
合并两个排序的链表
在排序算法那里有点卡住,最开始没考虑到分别为null和两个都为null的情况。加强排序算法的练习和所有测试用例的覆盖。//定义一个节点class ListNode{ private Integer value; ListNode next = null; ListNode(Integer value) { this.value = value;原创 2015-09-02 11:14:26 · 396 阅读 · 0 评论 -
重新认识Fibonacci
“年轻就该做点有趣的事情”首先去实现一个斐波那契数列,以前在剑指offer上有写过,但是题目有几个版本,例如第一个数为0还是1,例如今天我遇到了一家很有趣的一个架构师就告诉我了在整个正负数都有解。 其实到昨天我才知道原来assert主要是在程序里写测试用例的。 这个数列是非常经典的递归问题。 他跟我讲最开始来个简单点的,我也就没考虑太多,甚至没有判断正负的问题,就算之前的我不知道整个整数的解也原创 2015-09-08 09:24:46 · 300 阅读 · 0 评论 -
输入先序和中序构造二叉树
public static TreeNode reConstructTreeNode(int[] pre,int[] in) { //获取节点的根 int rootVal = pre[0]; //定义一个节点,将根节点值赋值给构造的节点 TreeNode treeNode = new TreeNode(rootVal);原创 2015-08-18 09:03:08 · 853 阅读 · 0 评论 -
数字计算次数问题实例
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。public static int numberOfInteger(int n) { int count = 0原创 2015-08-17 10:18:01 · 607 阅读 · 0 评论 -
链表倒序输出三种算法
输入一个链表,从尾到头打印链表每个节点的值。一共有三种方法,第一种方法为我自己的方法,另外两种参考其他人的,分别为利用栈和利用递归。/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val原创 2015-08-17 15:05:57 · 2255 阅读 · 0 评论 -
左旋转字符串
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!public static String leftTransform(String str,int n)原创 2015-08-17 13:52:24 · 294 阅读 · 0 评论