这是我参与更文挑战的第3天,活动详情查看: 更文挑战
加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
看似很简单,但是如果把进位的情况也考虑进来就很难了,最重要是找到进位规律。
public int[] plusOne(int[] digits) {
for (int i = digits.length - 1; i >= 0; i--) {
if (digits[i] == 9) { //逢9+1 要进位
digits[i] = 0;
} else {
digits[i]++; //当前为没有进位,直接返回
return digits;
}
}
//如果循环结束后,还是上面没有返回,那么就可能输入的是 9999这种情况
digits = new int[digits.length + 1];
digits[0] = 1;
return digits;
}
复杂度分析:
- 时间复杂度:,遍历一次数组长度。
- 空间复杂度:,全部进位的情况下,开辟了一个新的数组。
爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
已知爬 第f(n)阶有n种爬法,爬上到n阶可以是f(n-1)再上一阶,也可以是f(n-2)再上两阶到f(n),所以不难得出 .
public int climbStairs(int n) {
if (n <=2){
return n;
}
//上上级有多少种爬法
int prevprev = 1;
//上级有多少种爬法
int prev = 2;
int result = 0;
for (int i = 2; i < n; i++) {
result = prev + prevprev;
prevprev = prev;
prev = result;
}
return result;
}
复杂度分析:
- 时间复杂度:,遍历一次n的长度。
- 空间复杂度: