分类标签归档:Java算法

java算法-表示数值的字符串


题目描述

请实现一个函数用来匹配包括.*的正则表达式。模式中的字符.表示任意一个字符,而*表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串aaa与模式a.aab*ac*a匹配,但是与aa.aab*a均不匹配。

解法

利用正则表达式匹配即可。

[]  : 字符集合
()  : 分组
?   : 重复 0 ~ 1
+   : 重复 1 ~ n
*   : 重复 0 ~ n
.   : 任意字符
\\. : 转义后的 .
\\d : 数字
/**
 * @author bingo
 * @since 2018/11/21
 */
...

阅读全文...

java算法-正则表达式匹配


题目描述

请实现一个函数用来匹配包括.*的正则表达式。模式中的字符.表示任意一个字符,而*表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串aaa与模式a.aab*ac*a匹配,但是与aa.aab*a均不匹配。

解法

判断模式中第二个字符是否是 *

  • 若是,看如果模式串第一个字符与字符串第一个字符是否匹配:
      1. 若不匹配,在模式串上向右移动两个字符j+2,相当于 a* 被忽略
      1. 若匹配,字符串后移i+1。此时模式串可以移动两个字符j+2,也可以不移动j
  • 若不是,看当前字符与模式串的当前字符是否匹配,即 str[i...

阅读全文...

java算法-删除链表中重复的节点


题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

解法

解法一:递归

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

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

    ListNode(int val) {
        this.val = val;
    }
}...

阅读全文...

java算法-打印从 1 到最大的 n 位数


题目描述

输入数字 n,按顺序打印出从 1 最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数即 999。

解法

此题需要注意 n 位数构成的数字可能超出最大的 int 或者 long long 能表示的范围。因此,采用字符数组来存储数字。

关键是:

  • 对字符数组表示的数进行递增操作
  • 输出数字(0开头的需要把0去除)
/**
 * @author bingo
 * @since 2018/11/20
 */

public class Solution {

    /**
     * 打印从1到最大的n位数
     * @param n n位
  ...

阅读全文...

java算法-在O(1)时间内删除链表节点


题目描述

给定单向链表的头指针和一个节点指针,定义一个函数在 O(1) 时间内删除该节点。

解法

判断要删除的节点是否是尾节点,若是,直接删除;若不是,把要删除节点的下一个节点赋给要删除的节点即可。

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

public class Solution {

    class ListNode {
        int val;
        ListNode next;
    }

    /**
     * 删除链表的节点
     * @param head 链表头节点
     * @p...

阅读全文...

java算法-二进制中 1 的个数


题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

解法

解法一

利用整数 1,依次左移每次与 n 进行与运算,若结果不为0,说明这一位上数字为 1,++cnt。

此解法 i 需要左移 32 次。

不要用 n 去右移并与 1 进行与运算,因为n 可能为负数,右移时会陷入死循环。

public class Solution {
    public int NumberOf1(int n) {
        int cnt = 0;
        int i = 1;
        while (i != 0) {
            if ((n &am...

阅读全文...

java算法-数值的整数次方


题目描述

给定一个 double 类型的浮点数 baseint 类型的整数 exponent。求 baseexponent 次方。

解法

注意判断值数是否小于 0。另外 0 的 0 次方没有意义,也需要考虑一下,看具体题目要求。

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

public class Solution {
    /**
     * 计算数值的整数次方
     * @param base 底数
     * @param exponent 指数
     * @return 数值的整数次方
     */
  ...

阅读全文...

java算法-剪绳子


题目描述

给你一根长度为n绳子,请把绳子剪成m段(mn都是整数,n>1并且m≥1)。每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0]k[1]…*k[m]可能的最大乘积是多少?例如当绳子的长度是 8 时,我们把它剪成长度分别为 2、3、3 的三段,此时得到最大的乘积18

解法

解法一:动态规划法

时间复杂度O(n²),空间复杂度O(n)

  • 长度为 2,只可能剪成长度为 1 的两段,因此 f(2)=1
  • 长度为 3,剪成长度分别为 1 和 2 的两段,乘积比较大,因此 f(3) = 2
  • 长度为 n,在剪第一刀的时候,有 n-1 种可能的选择,剪出来的绳子又可以继续剪...

阅读全文...

java算法-矩阵中的路径


题目描述

请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如 a b c e s f c s a d e e 这样的 3 X 4 矩阵中包含一条字符串"bcced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。

解法

回溯法。首先,任选一个格子作为路径起点。假设格子对应的字符为 ch,并且对应路径上的第 i 个字符。若相等,...

阅读全文...

java算法-机器人的移动范围


题目描述

地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

解法

从坐标(0, 0) 开始移动,当它准备进入坐标(i, j),判断是否能进入,如果能,再判断它能否进入 4 个相邻的格子 (i-1, j), (i+1, j), (i, j-1), (i, j+1)。

/**
 * @author b...

阅读全文...