数据结构与算法Java语言描述
文章平均质量分 61
alan_gaohaodong
加油!
展开
-
深度优先搜索算法(java语言)
我们在学习了图之后,需要一种机制来遍历图,图的遍历算法也叫图搜索算法。与树的遍历算法(中序、前序、后序以及层序遍历)一样,图搜索算法也可以看做从图的某个源点开始,通过遍历和标记顶点来搜索图。下面讨论两种遍历图的算法: (1)深度优先搜索(DFS)。 (2)广度优先搜索(BFS)。一、深度优先搜索 例子如下图所示:原创 2017-12-24 15:31:47 · 3265 阅读 · 2 评论 -
从尾到头打印链表(剑指offer)
一、题目:输入一个链表,从尾到头打印链表每个节点的值。二、提示代码:/** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }**/import java.u...原创 2018-06-23 17:40:46 · 133 阅读 · 0 评论 -
斐波那契额数列(剑指offer第七题)
一、题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。 n<=39二、解题思路 (1)递归思路:先初始化出前连个数字,再递归求第n个数 (2)动态规划:用备忘录记下来放到数组中,可以降低时间复杂度,又分为两种:自顶向下和自底向上。 (3)用迭代法:用循环求出第n个数三、可运行java代码package 剑指offer;import java.io.F...原创 2018-07-08 20:42:17 · 312 阅读 · 0 评论 -
跳台阶(剑指offer第八题)
一、题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)二、思路分析 第n级的台阶是有n-1级台阶和n-2级台阶上跳上来的,所以这是一个递归,也即是斐波那契数列的应用。三、可运行java代码...原创 2018-07-08 21:03:29 · 224 阅读 · 0 评论 -
重建二叉树(剑指offer第四题)
一、题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。二、思路解析 考察已知前序和中序来构造二叉树。二叉树是特殊的,本身也是递归定义的,所以关于二叉树的很多考题都是从递归来考虑的,仔细分析...原创 2018-07-02 21:55:01 · 200 阅读 · 0 评论 -
变态跳台阶(剑指offer第九题)
一、题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。二、解题思路 可以延续上一题的思路,逆向思维来考虑这个问题。要想跳到第n级台阶,就可以从第n-1级、第n-2级、***、第1级 跳到第n级,再加上直接从地面到第n级的一种情况。 将问题分解为求子问题这是递归。所以有如下三种方法: 方法一:用...原创 2018-07-10 16:21:53 · 6974 阅读 · 5 评论 -
二进制中1的个数(剑指offer第十一题)
一、题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。二、解题思路 整数在计算机中都是补码形式保存的,正数的补码是自己原码本身,负数的补码是原码求反码再加1。 本题要求的是二进制中1的个数, 所以可以用1去和该整数做按位与运算,然后在将1左移一位。或者用n和n-1做按位与。三、可运行java代码/* * 输入一个整数,输出该数二进制表示中1的个数。其中负数...原创 2018-07-10 20:40:34 · 159 阅读 · 0 评论 -
用两个栈实现队列(剑指offer第五题)
一、题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。二、思路解析 方法一、自己的笨方法 stack1的状态stack2的状态 如果stack1为空且stack2非空时如果stack2为空且stack1非空时入队先入队,再将stack2倒腾过来先倒腾到stack1,再入栈出队先倒腾到stack2中,再出栈直接出栈 方法二、左程云大佬书里的方...原创 2018-07-04 21:55:39 · 230 阅读 · 0 评论 -
数值的整数次方(剑指offer第十二题)
一、题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。二、思路解析(1)常规思路:求次方的常规思路就是累积乘起来,所以可以用循环进行,但一定要注意特殊情况,保证程序的健壮性。(2)用快速幂思想:分情况...原创 2018-07-13 09:49:00 · 218 阅读 · 0 评论 -
旋转数组的最小数字(剑指offer第六题)
一、题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 二、思路分析: 我自己的思路是这样的,先把这个旋转数组的各种情况都考...原创 2018-07-07 16:10:35 · 315 阅读 · 0 评论 -
链表中倒数第k个结点(剑指offer第十四题)
一、题目描述 输入一个链表,输出该链表中倒数第k个结点。二、思路解析 方法一、常规思路,先求出总长度,再遍历链表一直到 倒数第K个结点 为止。 方法二、用两个指针p,q,p用来遍历整个链表,q用来把前k个作“”废掉“”,q指针正好到倒数第K个三、可运行java代码// 输入一个链表,输出该链表中倒数第k个结点。public class Solution...原创 2018-07-20 21:24:52 · 194 阅读 · 0 评论 -
反转链表(剑指offer第十五题)
一、题目描述 输入一个链表,反转链表后,输出新链表的表头。二、解题思路 需要额外的两个“指针”(java里没有指针这个概念,暂且用来理解),第一个指针temp用来指向链表已经逆序了的部分的头部,指针nextNode用来指向未逆序的部分的头部,不断地将nextNode链表部分的结点一个一个地给了temp链表部分。三、可运行代码(java)/** *...原创 2018-08-15 10:58:38 · 228 阅读 · 0 评论 -
二维数组中的查找(剑指offer)
一、题目描述:题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序, 每一列都按照从上到下递增的顺序排序。请完成一个函数, 输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。二、解题思路: 方法一:暴力法,从左到右,从上到下,依次查找 方法二:不难看出该矩阵是特殊的情况,矩阵是有序的,从左下角来看,向上数字递减,向右数字递增, ...原创 2018-06-21 15:51:51 · 238 阅读 · 0 评论 -
如何仅用递归函数和栈操作逆序一个栈(java实现)
一、题目描述 一个栈依次压入1,2,3,4,5,那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现栈中元素的逆序,但是只能用递归函数来实现,不能用其他数据结构。二、解答 我们需要两个递归函数: 递归函数一:将栈stack的栈底元素返回并移除。 具体过程就是如下代码中的getAndRemoveLastElemen...原创 2018-02-08 11:23:13 · 934 阅读 · 0 评论 -
两个栈实现一个队列(java版)
一、题目描述:用两个栈实现一个队列二、题目解析: 解法一: 大体思路:利用栈的特点,一个栈为主栈,是存放整个队列的所有元素的,当操作入队时,可以在主栈里push(入栈)一下;如果要操作出队时就再使用一个副栈,用来倒腾的,先将主栈里的所有元素push到副栈中,在获取副栈的第一个出栈元素即为队列的第一个出队元素,但要再倒腾回去,即将副原创 2018-02-07 21:26:24 · 592 阅读 · 0 评论 -
牛客网刷算法(一)之度度熊想去商场买一顶帽子(java语言)
度度熊想去商场买一顶帽子这是牛客网上的一道算法题: 度度熊想去商场买一顶帽子,商场里有N顶帽子,有些帽子的价格可能相同。 度度熊想买一顶价格第三便宜的帽子,问第三便宜的帽子价格是多少? 输入描述:首先输入一个正整数N(N 输出描述:如果存在第三便宜的帽子,请输出这个价格是多少,否则输出-1输入例子1:1010 10 10 10 20 20原创 2017-12-24 20:29:42 · 604 阅读 · 0 评论 -
牛客网刷算法(二)之度度熊回家(java版)
这是一道百度校园招聘笔试题第二道(共五道题)题目描述: 一个数轴上共有N个点,第一个点的坐标是度度熊现在位置,第N-1个点是度度熊的家。现在他需要依次的从0号坐标走到N-1号坐标。 但是除了0号坐标和N-1号坐标,他可以在其余的N-2个坐标中选出一个点,并直接将这个点忽略掉,问度度熊回家至少走多少距离?输入描述: 输入一个正整数N, N原创 2017-12-25 21:25:03 · 640 阅读 · 0 评论 -
动态规划算法入门(一)(java语言)
动态规划入门(一)动态规划算法是试图求解无法用贪心法和分治法获得最有解的问题。动态规划(Dynamic Programming,DP)是一项虽简单但较难掌握的技术。动态规划的定义: 动态规划和备忘录共同作用。动态规划和分治法的主要区别是:对于后者,子问题是相互独立的,而在动态规划中子问题可能是重叠的,通过使用备忘录(用一个表来保存已解决子问题的答案),对于大部分问题,动态规原创 2017-12-26 15:38:52 · 688 阅读 · 0 评论 -
相反数(java)网易笔试题
网易笔试编程题:相反数 一、题目描述:[编程题] 字符串碎片时间限制:1秒空间限制:32768K一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,"aaabbaaac"是由下面碎片组成的:'aaa','bb','c'。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的平均长度是多少。输入描述原创 2018-01-22 16:05:46 · 830 阅读 · 0 评论 -
[网易2018校招java笔试题]字符串碎片(java语言实现)
题目描述:[编程题] 字符串碎片时间限制:1秒空间限制:32768K一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,"aaabbaaac"是由下面碎片组成的:'aaa','bb','c'。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的平均长度是多少。输入描述:输入包括一个字符串s,字符串s的长度lengt原创 2018-01-23 21:45:57 · 1353 阅读 · 0 评论 -
java版小易准备去魔法王国采购魔法神器
小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币。魔法机器1:如果投入x个魔法币,魔法机器会将其变为2x+1个魔法币魔法机器2:如果投入x个魔法币,魔法机器会将其变为2x+2个魔法币小易采购魔法神器总共需要n个魔法币,所以小易只能通过两台魔法机器产生恰好n个魔法币,小易需要你帮他设计一个投入方案使他最后恰好拥有n个魔法币。原创 2018-01-16 22:00:26 · 1255 阅读 · 2 评论 -
用一个栈实现另一个栈的排序(java实现)
一、题目 一个栈中元素的类型为整形,现在想将该栈从顶到底按从大到小的顺序排序,只许申请一个栈,除此之外,可以申请新的变量,但不能申请额外的数据结构。如何完成排序? 二、解答 将要排序的栈记为stack,申请的辅助栈记为help。在stack上执行pop操作,弹出的元素记为cur。 (1)如果cur小于或等于help的栈顶元素,则将cur直接压入help; (2)如果cu...原创 2018-02-09 16:48:35 · 2240 阅读 · 0 评论 -
猫狗队列(java实现)
一、题目 宠物、狗和猫的类如下 public class Pet { private String type; public Pet(String type) { this.type = type; } public String getPetType() { return type; }}public class Dog exte...原创 2018-02-09 16:38:56 · 1042 阅读 · 0 评论 -
用栈来求解汉诺塔问题
一、题目 汉诺塔问题比较经典,这里修改一下游戏规则:现在限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧,而是必须进过中间。求当塔有N层时候,打印最优移动过程和最优移总步数。 例如,当塔数为两层时,最上层的塔记为1,最下层的塔记为2,如下图1所示: ...原创 2018-02-09 20:15:24 · 932 阅读 · 0 评论 -
生成窗口最大值数组(java实现)
一、题目 有一个整形数组arr和一个大小为w的窗口从数组最左边滑到最右边,窗口每次向右边滑一个位置。 例如,数组为[4,3,5,4,3,3,6,7],窗口大小为3时: [4,3,5],4,3,3,6,7 窗口中最大值为5 4,[...原创 2018-02-12 10:26:54 · 559 阅读 · 1 评论 -
java中Stack的peek方法
一、用法:java里Stack的peek方法是返回栈顶的元素但不移除它。但Stack的pop方法是会移除的。二、原因剖析: (1)这是JDK中的peek方法的源码 /** * Looks at the object at the top of this stack without removing it * from the stack.原创 2018-02-07 11:51:22 · 49930 阅读 · 5 评论 -
合并两个排序的链表(剑指offer第十六题)
一、题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。二、题目解析 (1)递归做法:两个链表分别取各自的第一个结点值, 比较大小,将较小值(如果等于时取第一个链表值)链入结果链表中。 (2)非递归做法:用循环来轮流判断两个链表各自第一个结点的值。直到用完其中的一个链表为止。三、可运行java代码public class...原创 2018-08-16 22:07:37 · 172 阅读 · 0 评论