一、青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入:n = 2
输出:2
示例 2:
输入:n = 7
输出:21
提示:
0 <= n <= 100
解题思路:斐波那契取模
class Solution {
public:
int numWays(int n) {
int ans[101]={1,1};
for(int i=2;i<=n;i++){
ans[i]=(ans[i-1]+ans[i-2])%(1000000007);
};
return ans[n];
}
};
二、数字范围按位与
给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。
示例 1:
输入: [5,7]
输出: 4
示例 2:
输入: [0,1]
输出: 0
解题思路:写一些数字就会发现规律直接 操作就行了
class Solution
{
public:
int rangeBitwiseAnd(int m, int n)
{
//任何数1&0 == 0 就看前几位有多少位相同就是结果
/*
11100
11011
11010
11001
11000
*/
int count = 0;
while (m != n)
{
m >>= 1;
n >>= 1;
count++;
}
n <<= count;
return n;
}
};
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。
示例 1:
输入: nums = [1,2,3,1], k = 3
输出: true
示例 2:
输入: nums = [1,0,1,1], k = 1
输出: true
示例 3:
输入: nums = [1,2,3,1,2,3], k = 2
输出: false
解题思路:维护一个k长度的 set 如果出现重复值就输出 true
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_set<int> set;
for(int i=0; i<nums.size(); i++)
{
if(set.find(nums[i]) != set.end()){
return true;
}
set.insert(nums[i]);
if(set.size() > k )
set.erase(nums[i-k]);
}
return false;
}
};
来源:力扣(LeetCode)