当前位置: 代码迷 >> 综合 >> 【每日一练】
  详细解决方案

【每日一练】

热度:75   发布时间:2024-02-01 00:47:48.0

一、青蛙跳台阶问题

一只青蛙一次可以跳上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 就看前几位有多少位相同就是结果/*1110011011110101100111000*/int count = 0;while (m != n){m >>= 1;n >>= 1;count++;}n <<= count;return n;}
};

三、存在重复元素 II

给定一个整数数组和一个整数 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)

  相关解决方案