算法与数据结构
文章平均质量分 56
kingdoooom
这个作者很懒,什么都没留下…
展开
-
Leetcode_06 Z 字形变换
字符串操作原创 2022-07-13 19:34:01 · 322 阅读 · 1 评论 -
基于Java实现的快速排序
什么是快速排序快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。编码思路就上述可得:1、选择基数:选择一个基数base,即作为第二步数组分割的各元素比较的基础数值,一般可以选择数组的第一个元素作为基数。2、数组分割:将数组分成两个子序列,左边都比基数小,右边都比基数大。3原创 2021-12-30 15:24:08 · 677 阅读 · 0 评论 -
Leetcode-202:快乐数
题目描述编写一个算法来判断一个数 n 是不是快乐数。「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为1,那么这个数就是快乐数。如果 n 是快乐数就返回 True ;不是,则返回 False 。思路分析根据题目意思,如果一个数按其规则变化最终可以为1则是快乐数,否则按规则变化会陷入无限循环。所以我们需要判断在按规则变化数字时:数字是否变为1。如果是,返回tru..原创 2020-05-08 20:50:08 · 238 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目如果输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果,如果是则返回true,如果不是则返回false。假设输入的数组的任意两个数字都互不相同。分析:在后序遍历得到的序列中,最后一个数字是树的根节点的值,数组中前面的数字可以分为两个部分:第一部分为左子树的节点的值,他们都比根节点的值要小;第二部分是右子树节点的值,他们都比根节点的值大。我们在解决这个问题的时候需要用同样的方法来确定...原创 2018-05-30 11:20:42 · 188 阅读 · 0 评论 -
HashMap与Hashtable区别
线程安全方面Hashtable是线程安全的,方法是Synchronized,效率较低。HashMap是非线程安全的,方法不是Synchronized的,效率较高。在多线程的环境下,要使用HashMap需要手动同步HashMap,使用Collections.synchronizedMap()方法使HashMap保持同步。Hashtable效率较低的原因是什么?在线程竞争激烈的环境下,Hashtabl...原创 2018-04-18 11:21:53 · 209 阅读 · 0 评论 -
再谈HashMap
在之前的一篇博客中,简单介绍了HashMap这种数据结构的基本原理,链接:聊聊HashMap。本问我还继续对HashMap中需要注意的地方再提一下。我们先来看看HashMap的相关代码:static class Node[] table;static class Node<K,V> implements Map.Entry<K,V>{ final K key; V...原创 2018-04-18 09:49:45 · 269 阅读 · 0 评论 -
从上往下打印出二叉树的每个结点,同一层的结点按照从左向右的顺序打印
思路:从题目看,可以知道其实就是要我们遍历给定的二叉树,要实现同一层的节点按照从左到右的顺序打印。这与我们平时使用的前序中序后序遍历二叉树不一样。这应该是广度优先遍历的思想。我们可以用到队列这个数据结构来完成这种遍历,具体做法是:从根节点开始,每一次打印一个结点的时候,如果该结点有子结点, 则把该结点的子结点入队。接下来到队列对头进行出队操作,一次打印出出队的元素,直至队列中所有的结点都被打印出来...原创 2018-03-29 10:16:04 · 1141 阅读 · 0 评论 -
聊聊HashMap
绪论HashMap是我们日常开发和面试中接触非常频繁的一个问题,它是基于映射(键值对)处理的数据结构。随着JDK版本的更新,JDK1.8对HashMap底层的实现进行了优化,比如典型的红黑树的数据结构和扩容优化。本文来说说HashMap的原理和实现。简介我们知道Java为数据结构中的映射定义了Java.util.Map接口,此接口有四个常用的实现类,分别为HashMap、Hashtable、Lin...原创 2018-04-16 15:41:52 · 231 阅读 · 0 评论 -
ArrayList、LinkedList、Vector的区别和实现原理
ArrayList、LinkedList、Vector是集合中经常拿来比较和面试的一个问题,我这里简要概括一下他们的区别和实现原理。存储结构ArrayList和Vector是按照顺序将元素存储(从下表为0开始),删除元素时,删除操作完成后,需要使部分元素移位,默认的初始容量都是10.ArrayList和Vector是基于数组实现的,LinkedList是基于双向链表实现的(含有头结点)。线程安全性...原创 2018-04-09 16:12:12 · 19029 阅读 · 0 评论 -
二叉查找树
引言我们知道,在查找算法中,性能最好的就是二分查找了,但是二分查找要求数列有序,这样我们每次进行查找时必须对数列进行排序,然后进行查找。所以二分查找适合数据元素很少增减的情况,如果数列经常变动,则不适合采用二分查找。下面来看看什么是二叉查找树。二叉查找树的概念二叉查找树或是棵空树,或者满足一下特性1.如果它的左子树不为空,那么它的左子树上的任意节点的值都小于根节点的值。2.如果它的右子树不为空,那...原创 2018-04-01 09:57:57 · 181 阅读 · 0 评论 -
输入两个整数序列,第一个序列表示栈的入栈顺序,判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有元素均不相等。
思路:这个问题,很自然得会想到把第一个序列的元素依次入栈,然后与第二个序列中的元素中的顺序出栈。我们在判断一个序列是不是栈的弹出序列有以下思路:如果下一个弹出的数字刚好是栈顶数字,那么入栈元素直接出栈。如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的元素压入栈,直到把下一个需要弹出的元素压入栈顶为止。如果所有的元素都入栈了仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列。实现...原创 2018-03-25 17:08:36 · 643 阅读 · 0 评论 -
八大排序算法——快速排序
什么是快速排序其实快速排序是对冒泡排序的一种改进,它的基本思想就是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据都要小,再按这种方式对这两部分的数据分别进行快速排序,整个排序过程可以递归进行,示的整个数据变成有序序列。快速排序的原理:排序算法的思想非常简单,在待排序的数列中,我们首先要找一个数字作为基准数,为了方便,我们把大于基准数的元素移动到左边,把大...原创 2018-05-08 20:41:39 · 2369 阅读 · 0 评论 -
浅谈ConcurrentHashMap
摘要在正式介绍ConcurrentHashMap之前,我想先说说并发和并行的两个概念。我们先来看看并发在操作系统和数据库操作时的相关概念1.在操作系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。2.在关系数据库中,允许多个用户同时访问和更改共享数据的进程。SQL Server 使用锁定以允许多个...原创 2018-04-21 10:56:26 · 485 阅读 · 0 评论 -
八大排序算法——冒泡排序
摘要冒泡排序是排序算法中比较简单的一个排序。它重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,知道没有要交换的数据元素为止。冒泡排序的原理首先我们肯定要有一个数组,里面存放着待排序的数据元素,我们如果需要把比较大的元素排在前面,把小的元素排在后面,那么需要从尾到头开始下面的比较操作。1.从尾部开始比较相邻的两个元素,如果尾部的元素比前面的大,就交换两...原创 2018-05-07 15:11:32 · 1952 阅读 · 0 评论 -
找出数组中每个数的右边第一个比它大的数
问题描述:给出一组数,找出数组中每个数的右边第一个比它大的数问题分析:利用单调栈,从左至右依次压入数据的索引(若直接压数,则还需要一个数组保存栈中元素所对应的数组位置,如果当前元素小于等于栈顶的索引所对应的数组的值,入栈当前索引,否则将栈顶索引出栈,并在栈顶索引所对应的res数组中记录下当前的值。到最后再检查栈中剩余元素,代表剩余元素右边没有比它大的值,在res对应位置赋值为-1。代码:...原创 2018-09-19 09:32:30 · 5299 阅读 · 0 评论 -
2018-8-30华为机试第三题
一个很明显的递归问题package cn.csu.ksh;import java.util.ArrayList;import java.util.List;import java.util.Scanner;public class Main2 { public static void main(String[] args) { Scanner sc = new ...原创 2018-08-30 15:58:00 · 1152 阅读 · 0 评论 -
2018-8-30华为机试题第1题
问题描述:字符串之数字子串求和思路:要求时间复杂度O(N),空间O(1) 1.不管遇到什么先-'0' =>cur 2.若cur不是数字->即不在0~9之间...需要先判断posi是不是false... 因为没第一次遇到'-'则会把posi设置为false,第二次先去看看之前posi, 如果是'-',那么就约掉这个'-',把posi设置为true...原创 2018-08-30 15:48:36 · 1576 阅读 · 1 评论 -
剑指Offer学习】【面试题18 :二叉树的镜像】
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。输入描述二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5...原创 2018-08-08 14:41:39 · 164 阅读 · 0 评论 -
【剑指Offer学习】【面试题6 :重建二叉树】
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路二叉树的前序遍历是从根节点开始的,依次前序遍历左子树,然后再前序遍历右子树。所以在前序遍历中,第一个出现的必定是跟节点。二叉树的中序...原创 2018-08-03 14:53:51 · 223 阅读 · 0 评论 -
【剑指Offer学习】【面试题12 :数值的整数次方】
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。题目分析很多人看到这个题基本上心里马上就有一个大致的思路了,就是用一个循环来做base的exponent次方,于是代码很快就能出来public double solution(double base,int exponent){ double result...原创 2018-08-07 11:23:33 · 186 阅读 · 0 评论 -
【剑指Offer学习】【二维数组中的查找】
题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束 如果该数字大于要查找的数字,剔除这个数字所在的列,如果该数字小于要查找的数字,剔除这个数字所在的行。 也就是说如...原创 2018-08-01 16:00:54 · 215 阅读 · 0 评论 -
【剑指Offer学习】【面试题10 :青蛙跳台的变种问题】
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。题目分析这次的场景和之前青蛙跳台的问题不一样,前一次的场景是青蛙一次可以调1个台阶,也可以跳2个台阶。现在的场景是:青蛙也可以跳上n级。所以情况又发生了变化。现在我们用数学归纳法来分析一下这个变种问题:首先,当n=1时,只有一种跳法 f(1)=1。其次,当...原创 2018-08-05 19:14:50 · 480 阅读 · 0 评论 -
【剑指Offer学习】【面试题9 :青蛙跳台问题】
问题描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。问题分析当n=1,有一种跳法当n=2,一次跳一个跳两次,一次跳两个跳一次,共两种跳法当n>=2时,n个台阶,设有F(n)种跳法 (1)若第一次选择跳1个台阶,那么剩下的n-1个台阶有F(n-1)种跳法 (2)若第一次选中...原创 2018-08-04 20:18:43 · 790 阅读 · 0 评论 -
汉诺塔问题
我在我的前几篇博客中谈到栈的数据结构,由于栈的先进后出的特点,使得她这中数据结构非常适合使用汉诺塔来解释,因为二者的操作原理一样。由此也衍生了针对汉诺塔的一些算法。其中一个就是三根柱子的汉诺塔的移动步骤问题。要求写出算法实现,给定初始的一根柱子上的圆盘个数,打印完成汉诺塔移动的实现步骤。汉诺塔的原理应该有许多同学对汉诺塔的规则都很了解,为了让部分不太了解汉诺塔的同学,这里我再详细地介绍一个汉诺塔的...原创 2018-03-14 16:12:40 · 285 阅读 · 0 评论 -
二叉树的相关概念以及操作
在数据结构与算法中,树的这中数据结构是我们必须要学习的,本文来首先来说说树中的二叉树什么是二叉树我们都知道树是一种数据结构,是由n(n>=1)个有限的节点组成的一种具有层次关系的集合。树的种类有很多,有二叉树、平衡二叉树、B树、B+树、哈夫曼树、B-树、B*树、红黑树、trie树等,本文我们来说说二叉树。二叉树是有限个节点的集合,这个集合可以是空集,也可以是一个根节点和两棵不相交的子二叉树组...原创 2018-03-20 15:56:54 · 255 阅读 · 0 评论 -
调整数组使奇数位于偶数前面
题目:调整一个数组,实现一个函数使得所有奇数位于数组的前半部分,偶数位于数组的后半部分。分析:这个题目比较简单,可以用双指针的做法来完成,具体思路:一个指针指向数组的开始位置,一个指针指向数组的尾部,如果开始位置的元素为偶数,结束的位置为奇数,那么则交换两个元素的位置,然后第一个指针向后移动,第二个指针向前移动,知道两个指针相遇代码实现如下原创 2017-12-15 09:47:39 · 229 阅读 · 0 评论 -
在O(1)时间删除链表节点
题目:给定单链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点分析:1.在寻常的单链表中删除一个节点,使用的最多的做法就是从链表的头结点开始,遍历链表,找到要删除的节点,并在链表中删除该节点,比如我要删除链表中节点b,我在遍历的时候找到了b节点的上一节点a,那么我可以把a节点的指针指向b节点的下一节点,这样就完成了对b节点的删除。但是需求规定的是我们完成删除操作时,时间复杂度原创 2017-12-14 19:28:10 · 349 阅读 · 0 评论 -
不使用库函数,求一个整数的n次幂(n为整数)
题目:不使用库函数,求一个整数的整数次方分析:1.第一种思路,在一个循环内完成代码如下double Power(double base, int exponent) { double ret = 1.0; for(int i=1; i<=exponent; i++) ret *= base; return ret;原创 2017-12-13 22:45:19 · 1038 阅读 · 0 评论 -
【剑指Offer学习】【面试题11 :统计一个十进制数中二进制1的个数】
分析:1.很多人看到这个需求的时候,第一反应是先把给定的十进制数转换成二进制数,再把二进制数转换为字符数组,再遍历这个字符数组计算1出现的次数,但是存在一些问题,首先在没有Java相关类库使用的情况下,十进制转换为二进制这个过程应该是很复杂的,并且如果最求算法效率的话,对于数组所需的额外空间以及循环遍历的n次比较的开销是我们所希望避免的。2.然后我们有相关经验的程序员应该可以想到,既...原创 2017-12-13 15:46:59 · 1367 阅读 · 0 评论 -
Java中的位运算,包括移位、位与、或、异或、非
Java中的位运算包括:左移( > ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),特别注意:除了位非( ~ )是一元操作符外,其它的都是二元操作符。并且在进行位运算的时候,例如a&b操作,都需要首先把a和b转换成二进制再进行操作1.位与(&)规则:a&b,先把十进制数a b都转换为二进制数,&的运算规则是:第一个操作数a的第n位与原创 2017-12-13 12:09:13 · 361 阅读 · 1 评论 -
斐波那契数列
题目:对于给定的参数n,求出该参数n下对应斐波那契数列值分析:斐波那契数列的表达式为:当n=0时,f(n)=0,当n=1时,f(n)=1,当n>=2时,f(n)=f(n-1)+f(n-2)1.常规方法package com.company;public class Main { public static int fabonaci(int n){原创 2017-12-12 18:59:01 · 1180 阅读 · 0 评论 -
找出旋转数组中最小的元素
题目:把一个数组最开始的若干个元素移到数组的末尾,我们称之为数组的旋转。输入一个递增数组的一个旋转数组,输出旋转数组的最小元素,例如{3,4,5,1,2}为{1,2,3,4,5}的旋转分析:1.最简单的做法就是遍历该数组的所有元素,比较每个元素的大小,选出最小的元素。具体代码在此省略 2.如果我们要追求更好的算法效率,那么我们完全可以使用二分查找的思想,设置数组的开始原创 2017-12-12 15:20:37 · 458 阅读 · 0 评论 -
使用两个栈实现队列
需求:用两个栈实现一个队列。队列的声明如下,实现它的两个函数appendTail(入队) 和deleteHead(出队)思想:栈的特点是先原创 2017-12-11 21:24:26 · 198 阅读 · 0 评论 -
Java中的Iterator
我们在学习collection(集合)的时候,必然少不了和Iterator打交道,本文将介绍一下Iterator的相关概念和用法1.collection先来说说collection,collection是存储一些相同类型对象的集合,下面我介绍一下collection中用到最多的一些方法public interface Collection{ int size(); bool原创 2017-12-20 15:27:00 · 247 阅读 · 0 评论 -
合并两个已排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使得新链表中的结点仍然按照顺序排序分析:这个问题一出来,马上就可以想到递归的思想,这种思想在链表以及树的操作中相当常见,在本题中主要涉及的还是链表中值得比较,比较出较小的结点就插入新的链表中,然后再比较下一个结点,直接上代码就一目了然了。public static class ListNode{ int value;原创 2017-12-19 18:46:12 · 229 阅读 · 0 评论 -
链表的逆序输出
【数据结构与算法】给定一个链表及该链表的头结点,要求实现链表的逆序输出 思考:可以用到栈的先入后出的特点,把链表的节点顺序入栈,然后一次出栈,这样就实现了链表的逆序输出相关代码:原创 2017-12-01 22:47:40 · 917 阅读 · 0 评论 -
在一个链表中,查找倒数的第k个节点
题目:在一个链表中,给定链表的头节点以及指定k值,找出该链表中倒数第k个节点分析:如果在数组中查找倒数第k个节点的话,只需要先计算倒数第k个节点的下标,然后直接访问该处的元素即可,但是链表的元素并不是以数组的形式存储的,那么我们需要另找方法,在链表中,除头结点以及尾节点外,每个节点都有其前后的节点,我们可以使用两个指针,第一个指针先指向第k个节点,第二个指向头节点,然后两个节点同时向尾部移原创 2017-12-18 13:55:31 · 399 阅读 · 0 评论 -
单链表的反转
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表的头结点分析:1.递归反转法在反转当前节点之前先反转后续节点。这样从头结点开始,层层深入直到尾结点才开始反转指针域的指向。简单的说就是从尾结点开始,逆向反转各个结点的指针域指向,递归反转发是使用的比较普遍的方法也是容易想到的方法代码实现:链表类public class ReserveLinkedLis原创 2017-12-19 14:23:46 · 242 阅读 · 0 评论 -
2018年百度Java后端面试题算法题
1、给一个函数,返回0和1,概率为p和1-p,请你实现一个函数,使得返回0、1的概率一样分析:这是典型的随机概率发生器的案例,我们先用数学知识来分析一下,函数返回0出现的概率为p,返回1出现的概率为1-p,如果单独返回1位0或1位1,那么没有办法实现返回0和1的概率一样。所以我们需要更大的位数来分析,因为存在返回0和1两种情况,我们把位数定为2,那么组合出来的信息就有2*2=4种:00 ---&g...原创 2018-03-05 10:57:22 · 4406 阅读 · 0 评论 -
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小素的min 函数。在该栈中,调用min、push 及pop的时间复杂度都是0(1)
思路与分析:在遇到问题之前,我们先来思考一个问题,如果题目仅仅是问:给你一个数据栈,要你编码实现去查找栈中最小的元素。那么你要如何实现?这个问题很简单,我们马上就能把代码写出来:package cn.csu;import java.util.Stack;import java.util.Iterator;public class StackFindMin { public in...原创 2018-03-12 13:36:51 · 424 阅读 · 0 评论