数据结构与算法(九)

54 阅读1分钟

1、剑指 Offer II 018 有效的回文

给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。

本题中,将空字符串定义为有效的 回文串 。

示例 1:

输入: s = "A man, a plan, a canal: Panama" 输出: true 解释:"amanaplanacanalpanama" 是回文串

示例 2:

输入: s = "race a car" 输出: false 解释:"raceacar" 不是回文串  

提示:

1 <= s.length <= 2 * 105 字符串 s 由 ASCII 字符组成

class Solution {
    public boolean isPalindrome(String s) {
        String newS = "";
        s = s.toLowerCase();
        for (int i = 0; i < s.length(); i++) {
            if(s.charAt(i) >= 'a' && s.charAt(i) <= 'z' ||
               s.charAt(i) >= '0' && s.charAt(i) <= '9' ){
                newS += s.charAt(i);
            }
        }


        for (int i = 0, j = newS.length() - 1; i <= j ; i++, j--) {
            if(newS.charAt(i) != newS.charAt(j)){
                System.out.println("i = " + newS.charAt(i) + "   j = " + newS.charAt(j));
                return false;
            }
        }

        return true;
    }
}

2、爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1:

输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶

示例 2:

输入:n = 3 输出:3 解释:有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶  

提示:

1 <= n <= 45

class Solution {
    public int climbStairs(int n) {
        if(n < 1)
            return n;
        int x = 0, y = 1, k = 0;

        for (int i = 1; i <= n; i++) {
            k = x + y;
            x = y;
             y = k;
         }
        return k;
    }
}

3、斐波那契数

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 给定 n ,请计算 F(n) 。  

示例 1:

输入:n = 2 输出:1 解释:F(2) = F(1) + F(0) = 1 + 0 = 1

示例 2:

输入:n = 3 输出:2 解释:F(3) = F(2) + F(1) = 1 + 1 = 2

示例 3:

输入:n = 4 输出:3 解释:F(4) = F(3) + F(2) = 2 + 1 = 3  

提示:

0 <= n <= 30

class Solution {
    public int fib(int n) {
        if(n < 1)
            return 0;
        if(n == 1 || n == 2)
            return 1;

        int[] arr = new int[n];
        int ans = 0;
        
        arr[0] = 1;
        arr[1] = 1;

        for (int i = 2; i < n; i++) {
            arr[i] = arr[i - 1] + arr[i - 2];
        }
        
        return arr[n - 1];
    }
}

4、杨辉三角

给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。

在「杨辉三角」中,每个数是它左上方和右上方的数的和。  

示例 1:

输入: numRows = 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

示例 2:

输入: numRows = 1 输出: [[1]]

class Solution {
    public List<List<Integer>> generate(int numRows) {
        int[][] arr = new int[numRows][numRows];

        List<List<Integer>> list = new ArrayList<>();

        for (int i = 0; i < numRows; i++) {
            arr[i][0] = 1;
            for (int j = 1; j <= i; j++) {
                if(i == j){
                    arr[i][j] = 1;
                }
                else {
                    arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
                }
            }
        }

        for (int i = 0; i < numRows; i++) {
            List<Integer> list1 = new ArrayList<>();
            for (int j = 0; j < numRows; j++) {
                if(arr[i][j] != 0){
                    list1.add(arr[i][j]);
                }
            }
            list.add(list1);
            System.out.println();
        }
        return list;
    }
}