数据结构和算法
文章平均质量分 58
yingzizizizizizzz
克制自己的懒惰
展开
-
二叉树、满二叉树、完全二叉树、平衡二叉树、哈夫曼树复习
二叉树的基本性质 ★树的基本定义 1、树是n(n>=0)个结点的有限集 2、树的结点包含一个数据元素及若干指向其子树的分支 3、结点拥有的子树数称为结点的度 4、度为0的结点称为叶子或终端结点 5、树的度是树内各结点的度的最大值 6、结点的层次从根开始定义起,根为第一层,根的孩子为第二层 7、树中结点的最大层次称为树的深度或高度 8、如果将树中结点的各子树看成从原创 2017-03-27 15:58:06 · 1597 阅读 · 0 评论 -
打印1到最大的n位数(java)
题目:输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。思路:(这个题看了半天才看懂书上的代码,/(ㄒoㄒ)/~~)注意要考虑大数。其中涉及到两个问题,一是大数的加1,二是大数的输出。我用字符串来表示大数,进行处理。输出需要注意的是前边的0不能打印出来,例如09,要打印9.大数加1,要考虑高低位进位。如果不进位原创 2017-05-12 13:10:57 · 717 阅读 · 0 评论 -
java 调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:要保持相对位置不变思路一:从前往后遍历,遇到偶数就把这个偶数后边的数全部前移,然后把这个偶数插入到最后。这样复杂度是o(n^2)。思路二:从前往后遍历,设置两个游标i、j;i寻找偶数,j寻找i+1后边原创 2017-05-22 12:18:52 · 574 阅读 · 0 评论 -
树的子结构
题目输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解题思路其实一开始看到关于树的问题就有点发憷。但是看了剑指offer的思路后,感觉还挺简单的。所以我们不要一开始就给自己下定义说这么难,我肯定做不出来来的定论。判断B是否是A的子结构,我们就要看B的根节点值是否能在A中找到相同的a,找到后,再看B的左孩子节点是否和a的左孩子节点值一样,然后原创 2017-06-02 10:35:37 · 258 阅读 · 0 评论 -
java 包含min函数的栈
题目定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。思路利用一个辅助栈来存放最小值 栈 3,4,2,5,1 辅助栈 3,3,2,2,1每入栈一次,就与辅助栈顶比较大小,如果小就入栈,如果大就入栈当前的辅助栈顶 当出栈时,辅助栈也要出栈 这种做法可以保证辅助栈顶一定都当前栈的最小值 import jav原创 2017-06-07 21:18:04 · 408 阅读 · 0 评论 -
java 栈的压入、弹出序列
题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路下一个弹出的值刚好是栈顶数值,那么直接弹出。看下一个popA中的值如果下一原创 2017-06-07 22:54:20 · 621 阅读 · 0 评论 -
java 二叉搜索树的后续遍历序列
题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路已知条件:后序序列最后一个值为root;二叉搜索树左子树值都比root小,右子树值都比root大。1、确定root;2、从后边遍历序列(除去root结点),找到第一个小于root的位置,则该位置左边为左子树,右边为右子树;原创 2017-06-08 22:57:43 · 329 阅读 · 0 评论 -
二叉树中和为某一值得路径
题目输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 思路这类问题可以用带记忆的DFS来解决。用递归调用,是一个压栈、出栈的过程。 用前序遍历的方式访问某一节点。把该结点添加到路径上,并且累加该结点的值。 如果该结点为叶结点并且路径中结点值的和刚好等于输入的整数,则打印该路径。 如果不是叶节点,则继续访原创 2017-06-14 10:56:51 · 540 阅读 · 0 评论 -
java 复杂链表的复制
题目输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)解决思路思路1:先复制原始链表的结点在元素链表的头结点开始找每个结点的random。每次都要从投开始找,然后连接起来,所以时间复杂度是o(n*n)思路2:原创 2017-06-14 21:45:45 · 437 阅读 · 0 评论 -
java 求解子数组子字符串的问题合集
问题一:连续子数组的最大和输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求解所有子数组的和的最大值。要求时间是o(n)。思路:动态规划的思想。 用函数f(i)表示第i个数字结尾的子数组的最大和,我们求出最大的f(i)即可。 p[i] i=0或f(i-1)<=0 f(i)=f(i-1)+p[i] i>0且f(i-1)>0原创 2017-07-22 11:51:33 · 563 阅读 · 0 评论 -
小红书提前批笔试题
1.翻转字符串将每2k个字符的前k个翻转;如果少于k,则翻转全部字符;如果多于k少于2k,则翻转前k个,剩余保持不变。思路:递归2k个字符串import java.util.*;public class Main { public static String revs(String s,int k){ int len=s.length(); StringBuffer st原创 2017-07-19 22:25:51 · 4885 阅读 · 0 评论 -
2017腾讯实习生招聘笔试编程题
查找数组中的个数,要求复杂度越小越好。例如输入:数组[1,2,2,3]输出:1(1) 2(2) 3(1)解题思路:复杂度越小越好的话,想到用map来存储数值和个数的映射关系,这样就不用二重循环,用一层就可以了,复杂度是O(n)。其中遇到的错误是要从控制台输入数组1,2,2,3,这些以,隔开存到String类型的数组,然后再原创 2017-04-03 13:34:22 · 725 阅读 · 0 评论 -
交换排序——快速排序
基本思想:1)选择一个基准元素,通常选择第一个元素或者最后一个元素,2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。3)此时基准元素在其排好序后的正确位置4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。操作过程:选取第一个元素为基准元素;然后一趟排序,左边是比基准值小的,右原创 2017-04-24 09:47:32 · 299 阅读 · 0 评论 -
java 在o(1)时间内删除链表结点
题目: 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。/** * 在o(1)时间删除链表 * @author lenovo *把要删除的i的下一个结点j的数据赋值给i;i的nextNode指向j的下一个结点,接着删除j结点。这样就相当于删除了i了。 *考虑特殊的情况,i在链表尾部,没有下一个结点。只能顺序查找,找到i的前一个结点了。 *只有一个结点i,这时原创 2017-05-21 22:01:57 · 406 阅读 · 0 评论 -
从中间结点开始反转链表
题目从中间结点开始反转链表例如1->2->3->4->5 反转 1->2->5->4->31->2->3->4 反转后 1->2->4->3思路先找到中间结点,保存中间结点从中间结点反转。最后,将保存的中间结点和反转后的链接其中,反转链表,用到了三个指针来控制的方法和头插法。代码//一个链表,反转从中间结点到最后一个结点的结点public c原创 2017-06-16 11:33:14 · 338 阅读 · 0 评论 -
合并两个排序的链表
题目输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。例如,链表1,3,5 链表2,4,6 最后合并成1,2,3,4,5,6思路一开始拿到这题的时候,想到的是但是明显最后一种情况不对。正确思路应该是这样的申请一个空结点作为合并后的head;然后比较l1和l2的值得大小,谁小就赋值给head;然后这个head结点不能改原创 2017-06-01 13:31:38 · 268 阅读 · 0 评论 -
两个栈实现队列与两个队列实现栈(java)
两个栈实现队列的pop和pushimport java.util.*;/** * 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 * 思路:入队列,直接用堆栈入就行 * 出队列,当栈2位空的时候,把栈1所有的数据全部pop到栈2;栈2不为空的时候,直接将剩余的pop出去。 * */public class stackqueue {原创 2017-04-10 23:09:21 · 237 阅读 · 0 评论 -
旋转数组的最小数(java)
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路:用最笨的方法,用一层循环一个一个比较找到最小值,时间复杂度是o(n)。比较好的思路,使用原创 2017-04-12 22:10:19 · 406 阅读 · 0 评论 -
斐波那契数列的实现(java)
public int Fibonacci(int n) { int result=1; if(n==0){ result=0; } if(n==1){ result=1; }else if(n>=2 && n<=39){ result=Fibonacci(n-原创 2017-04-13 13:19:58 · 509 阅读 · 0 评论 -
二进制中1的个数(java)——位运算
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路:看到二进制字眼,一般都是考察的位运算。思路一:将n和1与(&)运算,然后再右移;其中,如果运算结果是1则表明n的最后一位是1,count+1;否则就是最后一位是0,count不变.缺陷:这种没有考虑到n是负数的时候。在计算机中负数存储成补码,右移的时候补位是1而不是0,所以1会一直存在,这样会造成一直循环,导致原创 2017-04-14 10:51:44 · 1589 阅读 · 0 评论 -
数值得整数次方——小问题引起大思考
这题看似简单,其实有许多需要注意的。考虑全面。需要考虑base、exponent是0,正数、负数的情况。算法的优化:power1解法时间复杂度是o(n),其实下边还应该再思考,看是否能缩短时间复杂度。这时就可以从for循环这改进。a的8次方可以分为a的2次方*a的4次方,而a的4次方又可以分为两个a的2次方的相乘。这样和之前的斐波那契数列想似,我们就可以使用递归了。公式为当n为原创 2017-05-10 23:06:50 · 480 阅读 · 0 评论 -
(带哨兵)直接插入排序
基本思想:将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。要点:设立哨兵,作为临时存储和判断数组边界之用。哨兵有两个作用:① 进人查找(插入位置)循环之前,它保存了R[i]的副本,使不致于因记录后移而丢失R[i]的内容;② 它的主要作用是:在查找循原创 2017-04-22 13:02:05 · 1951 阅读 · 0 评论 -
插入排序——希尔排序
希尔排序,也叫递减增量排序,是插入排序的一种更高效的改进版本。希尔排序是不稳定的排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的:插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位基本思想:所以,希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插原创 2017-04-22 15:08:26 · 284 阅读 · 0 评论 -
选择排序——简单选择排序
基本思想:在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。操作方法:第一趟,从n 个记录中找出关键码最小的记录与第一个记录交换;第二趟,从第二个记录开始的n-1 个记录中再选出关键码最小的记录与第二个记录交换;以原创 2017-04-22 15:46:49 · 309 阅读 · 0 评论 -
选择排序——堆排序
前提知识:若以一维数组存储一个堆,则堆对应一棵完全二叉树,且所有非叶结点的值均不大于(或不小于)其子女的值,根结点(堆顶元素)的值是最小(或最大)的。小顶堆:{12,36,24,85,47,30,53,91}大顶堆:{96, 83,27,38,11,09}如果i>1,则双亲是结点[i/2]。也就是说下标i与2i和2i+1是双亲子女关系。 当排序对象为数组时,下标从0开始,所以下原创 2017-04-23 12:24:59 · 302 阅读 · 0 评论 -
交换排序——冒泡排序
基本思想:在要排序的一组数中,对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。操作过程:这个没什么好说的,大家都很清楚。算法的实现:public static void main(String[] args) { // TODO Auto-g原创 2017-04-23 15:55:39 · 289 阅读 · 0 评论 -
归并排序
基本思想:归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。合并过程:设r[i…n]由两个有序子表r[i…m]和r[m+1…n]组成,两个子表长度分别为n-i +1、n-m。j=m+1;k=i;i=i; //置两个子表的起始下标及辅助数组的起始下标若原创 2017-04-25 22:18:50 · 273 阅读 · 0 评论 -
java 二叉树的镜像
题目操作给定的二叉树,将其变换为源二叉树的镜像。二叉树的镜像定义: 源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \原创 2017-06-05 11:27:43 · 326 阅读 · 0 评论 -
最小的k个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路方法一:先升序排序,然后取前k个值即可。复杂度是o(nlogn)import java.util.*;public class Solution { public ArrayList GetLeastNumbers_So原创 2017-08-30 16:37:49 · 203 阅读 · 0 评论