分类标签归档:Java算法

java算法-栈的压入、弹出序列


题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

解法

判断下一个要弹出的元素:

  • 如果刚好是栈顶元素,直接弹出。
  • 如果不在栈顶,则把压栈序列中还没有入栈的数字压入栈,直到待弹出的数字压入栈顶。
  • 如果所有数字都压入栈顶后依然没有后找到下一个弹出的数字,则不可能是弹出序列。
import java.util.Stack;

/*...

阅读全文...

java算法-顺时针打印矩阵


题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下 4 X 4 矩阵:

1   2   3   4
5   6   7   8
9   10  11  12
13  14  15  16

则依次打印出数字:

1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

解法

由外往里,一圈圈打印矩阵即可。

import java.util.ArrayList;

/**
 * @author bingo
 * @since 2018/11/22
 */

public class Solution {
    /**
     *...

阅读全文...

java算法-对称的二叉树


题目描述

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

解法

比较二叉树的前序遍历序列和对称前序遍历序列是否一样,若是,说明是对称的。

/**
 * @author bingo
 * @since 2018/11/22
 */

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = v...

阅读全文...

java算法-树的子结构


题目描述

输入两棵二叉树AB,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

解法

递归方式遍历:

  • 在树A中找到和树B的根结点值一样的结点R
  • 判断树A以R为根结点的子树是否包含与树B一样的结构
/**
 * @author bingo
 * @since 2018/11/22
 */

/*
 public class TreeNode {
 int val = 0;
 TreeNode left = null;
 TreeNode right = null;

 public TreeNode(int val) {
 this.val = val;

 }
...

阅读全文...

java算法-二叉树的镜像


题目描述

操作给定的二叉树,将其变换为源二叉树的镜像。

源二叉树
            8
           /  \
          6   10
         / \  / \
        5  7 9 11

镜像二叉树
            8
           /  \
          10   6
         / \  / \
        11 9 7  5

解法

将根结点的左右孩子互换,之后递归左右孩子。

/**
 * @author bingo
 * @since 2018/11/22
 */

/*
 public class Tr...

阅读全文...

java算法-反转链表


题目描述

输入一个链表,反转链表后,输出新链表的表头。

解法

解法一

利用头插法解决。

/**
 * @author bingo
 * @since 2018/11/22
 */

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    /**
     * 反转链表
     * @param head 链表头部
     * @retur...

阅读全文...

java算法-合并两个排序的链表


题目描述

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

解法

解法一

同时遍历两链表进行 merge

/**
 * @author bingo
 * @since 2018/11/22
 */

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    /**
     * 合并两个排序链表
 ...

阅读全文...

java算法-链表中环的入口结点


题目描述

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null

解法

  • 先利用快慢指针。若能相遇,说明存在环,且相遇点一定是在环上;若没有相遇,说明不存在环,返回 null
  • 固定当前相遇点,用一个指针继续走,同时累积结点数。计算出环的结点个数 cnt
  • 指针 p1 先走 cnt 步,p2 指向链表头部,之后 p1,p2 同时走,相遇时,相遇点一定是在环的入口处。因为 p1p2 多走了环的一圈。
/**
 * @author bingo
 * @since 2018/11/22
 */

/*
 public class ListNode {
    int...

阅读全文...

java算法-链表中倒数第k个结点


题目描述

输入一个链表,输出该链表中倒数第k个结点。

解法

pre 指针走 k-1 步。之后 cur 指针指向 phead,然后两个指针同时走,直至 pre 指针到达尾结点。

当用一个指针遍历链表不能解决问题的时候,可以尝试用两个指针来遍历链表。可以让其中一个指针遍历的速度快一些。

此题需要考虑一些特殊情况。比如 k 的值小于 0 或者大于链表长度。

/**
 * @author bingo
 * @since 2018/11/21
 */

/*
public class ListNode {
    int val;
    ListNode next = null;

    L...

阅读全文...

java算法-调整数组顺序使奇数位于偶数前面


题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

解法

解法一

计算出奇数的个数,就很容易写出来了。

import java.util.Arrays;

/**
 * @author bingo
 * @since 2018/11/21
 */

public class Solution {
    /**
     * 调整数组元素顺序,使得奇数元素位于偶数元素前面,且保证奇数和奇数,偶数和偶数之间的相对位置不变。
     * @param array ...

阅读全文...