【题目】假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
之前用了递归,但显示在45后超出时间限制,不能走出完全的测试用例
所以题目本意不是用递归解决的
解题思路: 动态规划
public int climbStairs(int n) {
if(n==1) {
return 1;
}
if(n==2) {
return 2;
}
int[] dp = new int[n+1];
dp[1] = 1;
dp[2] = 2;
for(int i =3;i<dp.length;i++) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
示例:
输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-digits
【递归解很简单】
public int addDigits(int num) {
int sum = 0;
while(num > 0){
sum += num%10;
num = num/10;
}
int ret = sum;
if(sum >9) {
return addDigits(ret);
}
return ret;
}
给定一个数组 找出数组最后一个出现一次的数
一个朴素的做法是使用「哈希表」进行计数,然后倒着遍历数组将第一次遇到计数为 1 的数字进行输出。
哈希表以「数值 : 数值出现次数」形式进行存储。
public static int solution (int[] source) {
// write code here
HashMap<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < source.length; i++) {
if (map.containsKey(source[i])) {
int n = map.get(source[i]);
map.put(source[i],n+1);
}else {
map.put(source[i],1);
}
}
int count = 0;
for (int i = source.length-1; i >=0 ; i--) {
if (map.get(source[i]) == 1) {
count = i;
break;
}
}
return source[count];
}