当前位置: 首页 > news >正文

AI刷题-数列推进计算任务、数组中的幸运数问题

目录

一、数列推进计算任务

问题描述

测试样例

解题思路: 

问题理解

数据结构选择

算法步骤

优化思路

最终代码: 

运行结果: 

 二、数组中的幸运数问题

问题描述

测试样例

解题思路: 

问题理解

数据结构选择

算法步骤

关键点

最终代码:

运行结果: 

 ​编辑


一、数列推进计算任务

问题描述

小F想知道推进数列a的第 n 项值 anan​ ,该数列由 a0=0,a1=1,a2=1a0​=0,a1​=1,a2​=1 定义,并且对于每个 n>=3,an=an−1+an−2+an−3n>=3,an​=an−1​+an−2​+an−3​。

约束条件:

  • 时间限制:3s
  • n为整数,数据范围 1 ≤ n ≤ 25

测试样例

样例1:

输入:n = 5
输出:7

样例2:

输入:n = 12
输出:504

样例3:

输入:n = 18
输出:19513

解题思路: 

问题理解

你正在处理一个递推数列问题,数列的定义如下:

  • 初始条件:a_0 = 0a_1 = 1a_2 = 1
  • 递推关系:对于 n >= 3a_n = a_{n-1} + a_{n-2} + a_{n-3}

数据结构选择

由于这是一个递推问题,我们可以使用数组来存储已经计算过的数列值,以避免重复计算。

算法步骤

  1. 初始化数组:创建一个数组 a,并根据初始条件设置 a[0]a[1]a[2]
  2. 递推计算:从 n = 3 开始,使用递推公式 a[n] = a[n-1] + a[n-2] + a[n-3] 计算数列的值,直到 n
  3. 返回结果:返回数组中第 n 个元素的值。

优化思路

  • 记忆化:为了避免重复计算,可以使用记忆化技术,即在计算过程中存储已经计算过的值。
  • 动态规划:通过动态规划的方式,从底向上计算数列的值,这样可以避免递归带来的栈溢出问题。

 

最终代码: 

# include <iostream>
using namespace std;int solution(int n) {// PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE// write code hereif(n-3>=0)return solution(n-1)+solution(n-2)+solution(n-3);if(n==0)return 0;if (n==1||n==2) {return 1;}
}int main() {cout << (solution(5) == 7) << endl;cout << (solution(12) == 504) << endl;cout << (solution(18) == 19513) << endl;return 0;
}

运行结果: 

 

 二、数组中的幸运数问题

问题描述

在给定整数数组中,找出最大满足该条件的数:出现次数等于其数值的整数,如果不存在则返回 -1。


测试样例

样例1:

输入:arr = [4, 3, 3, 2]
输出:-1

样例2:

输入:arr = [1, 2, 2, 3, 3, 4, 4, 4, 4, 3]
输出:4

样例3:

输入:arr = [6, 6, 6, 6, 6]
输出:-1

解题思路: 

问题理解

我们需要在一个整数数组中找到一个数,这个数的出现次数等于它本身的数值。如果不存在这样的数,则返回 -1。

数据结构选择

为了统计每个数出现的次数,我们可以使用一个哈希表(在C++中可以使用 std::unordered_map)。哈希表可以快速地记录和查询每个数出现的次数。

算法步骤

  1. 初始化哈希表:用于记录每个数出现的次数。
  2. 遍历数组:统计每个数出现的次数,并将其记录在哈希表中。
  3. 查找满足条件的数:再次遍历数组,检查每个数是否满足其出现次数等于其数值的条件。
  4. 返回结果:如果找到满足条件的数,返回该数;否则返回 -1。

关键点

  • 哈希表的使用可以大大提高统计和查询的效率。
  • 需要两次遍历数组:第一次用于统计,第二次用于查找。

最终代码:

#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;int solution(std::vector<int> arr) {// PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE// write code hereunordered_map<int, int> ar;for (auto i : arr) {ar[i]++;}// 遍历哈希表,查找满足条件的数for (auto it = ar.begin(); it != ar.end(); ++it) {if (it->first == it->second) {return it->first;}}return -1;
}int main() {cout << (solution({4, 3, 3, 2}) == -1) << endl;cout << (solution({1, 2, 2, 3, 3, 4, 4, 4, 4, 3}) == 4) << endl;cout << (solution({6, 6, 6, 6, 6}) == -1) << endl;return 0;
}

运行结果: 

 

 

 


http://www.mrgr.cn/news/83479.html

相关文章:

  • 单片机(MCU)-简单认识
  • 如何实现多级缓存?
  • windows系统如何将基座大模型私有化部署
  • 《解锁鸿蒙系统AI能力,开启智能应用开发新时代》
  • hutool-http实现离线爬虫
  • PySpark广播表连接解决数据倾斜的完整案例
  • 【DAPM杂谈之三】DAPM的初始化流程
  • 单片机Day1
  • 代码随想录 字符串 test1
  • MathBuddyGUI:带控制系统仿真功能、积分运算的计算器,MATLAB课程设计
  • Vue3学习总结
  • Liunx-搭建安装VSOMEIP环境教程 执行 运行VSOMEIP示例demo
  • 李宏毅机器学习课程笔记02 | 机器学习任务攻略General Guide
  • week06_预训练语言模型—BERT
  • Android车机DIY开发之软件篇(八)单独编译
  • 全面教程:Nacos 2.3.2 启用鉴权与 MySQL 数据存储配置
  • Tkinter组件-Button按键
  • 《ROS2 机器人开发 从入门道实践》 鱼香ROS2——第6章内容
  • Windows 下Mamba2 / Vim / Vmamba 环境安装问题记录及解决方法终极版(无需绕过triton)
  • 攻防靶场(34):隐蔽的计划任务提权 Funbox1
  • 【云计算】OpenStack云计算平台
  • Qt 5.14.2 学习记录 —— 십일 QLCDNumber、ProgressBar、QCalendarWidget
  • 前端开发:Web前端和HTML
  • C++之函数提高
  • 国产编辑器EverEdit - 扩展脚本:新建同类型文件(避免编程学习者反复新建保存练习文件)
  • C语言 操作符_位操作符、赋值操作符、单目操作符