经典算法题
文强强
有什么推荐的基础书吗各位大神
展开
-
链表反转
链表定义class ListNode { int val; ListNode next; ListNode(int x) { val = x; }} 非递归实现很简单,只需要遍历一遍链表,在遍历过程中,把遍历的节点一次插入到头部。public ListNode reverseLi原创 2017-11-20 16:19:35 · 137 阅读 · 0 评论 -
二分查找 最好理解的版本
第一种方法通过递归来实现改变,利用判断条件和mid修改start和end第二种方法是通过普通循环来实现,利用一个while来进行判断,通过mid修改start和end总而言之 :数组的长度-1和0除以2就是第一个mid 然后改变start和end最后不断的按照原来的大于小于逻辑缩减范围就能取到该值或者返回-1 没有这个值package com.bj58.finance.blp.task.conf...原创 2018-05-08 16:26:02 · 228 阅读 · 0 评论 -
快速排序(三)亲测可运行代码
package com.bj58.finance.blp.task.config;public class A { public static void main(String[] args) { int srcArray[] = {3,5,11,17,21,23,28,30,32,50,64,78,81,95,101}; A a=new A(); ...原创 2018-05-09 14:43:26 · 186 阅读 · 0 评论 -
快速排序 第二种方法以及java 代码和c代码 (有注释)
这些形象的小图片给我们最直观的印象排序算法显神威方法其实很简单:分别从初始序列“6 1 2 7 9 3 4 5 10 8”两端开始“探测”。先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换他们。这里可以用两个变量i和j,分别指向序列最左边和最右边。我们为这两个变量起个好听的名字“哨兵i”和“哨兵j”。刚开始的时候让哨兵i指向序列的最左边(即i=1),指向数字6。让哨兵...转载 2018-05-09 12:20:07 · 260 阅读 · 0 评论 -
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
思路: 建立一个辅助栈s,把序列1,2,3,4,5依次压入辅助栈s,并按照第二个序列4,5,3,2,1的顺序从辅助栈s中弹出数字。 先将序列1,2,3,4,5依次压入栈s,每次压栈时都判断栈s的当前栈顶元素跟序列4,5,3,2,1的第一个元素是否相等。当压入4之后,发现栈顶元素跟序列4,5,3,2,1的第一个元素相等。弹出栈s的栈顶元素4,然后将序列4,...原创 2018-03-13 14:15:30 · 881 阅读 · 0 评论 -
求一个二叉树的镜像 递归和非递归思想
public void Mirror(BitNode root){ if(root==null) return;; else { BitNode temp=root.lchild; root.lchild=root.rchild; root.rchild=temp; Mi...原创 2018-03-13 10:59:51 · 193 阅读 · 0 评论 -
输入两个二叉树,判断A是不是B的子树
//输入两个二叉树,判断A是不是B的子树 public boolean hasSubTree(BitNode root1,BitNode root2){ boolean result=false; if(root1!=null&&root2!=null){ if(root1.data==...原创 2018-03-13 09:58:49 · 532 阅读 · 0 评论 -
二叉树的四种遍历 (六个方法递归 非递归都有 包含二叉树的创建java方法)
public class BitNode { String data; BitNode lchild; BitNode rchild; public void setNode(String data, BitNode lc, BitNode rc) { this.data = data; lchild = lc; r...原创 2018-03-12 11:30:58 · 117 阅读 · 0 评论 -
两个无序的数组 如何进行合并 为一个有序的数组
这里我们首先来看自己也才毕业半年,这些题比较适合新手练练思想,技术之路且行且珍惜。算法绝对是核心竞争力。两个无序的数组 那么首先第一步合并第二步 使用正则表达式去掉【】第三步 split进行划分第四步 最核心的排序此处用了Arrays.sort 第二个参数用了匿名内部类 内部用了compartor这个接口 重写了compare方法进行比较排序/ public static void ...原创 2018-03-02 18:07:16 · 3855 阅读 · 0 评论 -
今日算法 两个升序的数组进行排序
需要注意的是是否去重 思想是定义两个指针都从0开始比较 小的指针向后移动一位 只要小于就移动进入第二个if 给一个大于的条件最后剩下的进行添加如果不想去重 在算法过程中 要add两次 这儿用了一个List 用String 也可以 性能差一点//2个有序数组hebng public static List<Integer> sort(int[] a,int[] b){...原创 2018-03-02 18:00:19 · 834 阅读 · 0 评论 -
二叉树知道根节点的四种遍历思想
1 package Tree; 2 3 import java.util.ArrayDeque; 4 import java.util.Queue; 5 import java.util.Stack; 6 7 /** 8 * Created by lenovo on 2017/9/6. 9 */ 10 public class BinaryTree { ...原创 2018-03-09 20:34:00 · 1697 阅读 · 0 评论 -
关于要让一个数组的奇数全部位于偶数前面(三个while循环思想)
public void order(int[] array){ if(array==null||array.length==0) { return; } int start=0; int end=array.length-1; while (start<end){ while (start<end&...原创 2018-03-08 10:46:16 · 169 阅读 · 0 评论 -
冒泡排序温故知新
先来介绍下核心思想,一直觉得编程重在思想:冒泡排序的基本思想就是:从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队列的队尾,从而成为有序序列的一部分;下一次继续这个过程,直到所有数据元素都排好序。算法的核心在于每次通过两两比较交换位置,选出剩余无序序列里最大(小)的数据元素放到队尾。冒泡排序算法如下:1、比较相邻的元素。如果第一个比第二个大(小),就...原创 2018-03-07 18:07:00 · 170 阅读 · 0 评论 -
打印1到最大的n位数(java实现)
思路1:最简单的想法就是先找出最大的n位数,然后循环打印即可。public static void Print1ToMaxOfNDigits_1(int n){ int number = 1; int i = 0; while(i++ < n){ number *= 10; } //number-1是最大的n位数 for(int...原创 2018-02-27 17:53:42 · 606 阅读 · 0 评论 -
输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。
输入数字n,按顺序打印出1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。陷阱:考虑大数问题,就是输入的数字非常大的情况,如100,怎么表示100位的数呢,可以用字符串保存。 细节问题:1.字符串递增的溢出判断2.打印时过滤0 方法一: 使用字符串数组表示大数,最直观的方法是字符串里每个字符都是’0’到’9’之间的某一个字符,用来表示数字中的一位。...转载 2018-02-27 17:49:53 · 1006 阅读 · 0 评论 -
求最长不重复子串
问题描述:给定一个字符串,找出这个字符串中最长的不重复子串。比如对于字符串“sadus”,那么返回的结果应该是“sadu”或者“adus”(返回一个即可);对于字符串“acbba”,返回的应是“acb”。 对于这样一个问题,想必大家首先想到利用的数据结构是HashMap,利用HashMap来保证子串的不重复。但是我们可以想想能不能不用HashMap呢?答案显然是可以的,因为字符数是固定...原创 2018-02-27 10:29:32 · 256 阅读 · 0 评论 -
剑指offer47道经典 java版
面试题2:实现单例模式1.饿汉式单例类public class SingletonClass{private static final SingletonClass instance=new SingletonClass();//私有构造函数private SingletonClass(){}public static SingletonClass getInstance(原创 2017-11-20 20:25:39 · 212 阅读 · 0 评论 -
快速排序
第一遍快速排序不会直接得到最终结果,只会把比k大和比k小的数分到k的两边。为了得到最后结果,需要再次对下标2两边的数组分别执行此步骤,然后再分解数组,直到数组不能再分解为止(只有一个数据),才能得到正确结果。主要两种 第一种挖坑法 百度百科这个很详细了假设用户输入了如下数组:下标012345数据627389创建变量i=0(指向第一个数据), j=5(指向最后一个数据), k=6(赋值为第一个数据...转载 2018-05-08 18:10:41 · 377 阅读 · 0 评论