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 阶
- 2 阶
示例 2:
输入:n = 3 输出:3 解释:有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 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;
}
}