2025 - 题解
标签与难度
标签: 模拟, 字符串处理, 基础语法, 循环, 条件判断 难度: 800
题目大意喵~
各位算法大师,你们好呀,我是你们的小助手我,喵~ 今天我们遇到的这道题超级可爱,也超级直接哦!
题目是这样的: 我们一开始有一个数字,它的初始值是 1。然后,我们会得到一个由减号 '-' 和星号 '*' 组成的字符串。
我们需要从左到右一个一个地看这个字符串里的字符:
- 如果遇到的是
'-',我们就把手里的数字减去 1。 - 如果遇到的是
'*',我们就把手里的数字乘以 2。
当整个字符串都处理完之后,我们需要判断一下,我们手里的数字最终有没有大于或者等于 2025。
- 如果是的话,就骄傲地输出
YES! - 如果不是的话,就输出
NO。
是不是很简单明了呢?就像是跟着食谱做菜一样,一步一步来就好啦,喵~
解题思路分析
这道题的核心思想就是模拟(Simulation)!也就是说,题目怎么说,我们就怎么做,完全不需要什么花里胡哨的复杂算法,呐。
让我来带你一步一步拆解这个问题吧!
初始化: 题目告诉我们,初始数字是
1。所以,我们首先需要一个变量来存放这个数字,就叫它sum好了,然后让sum = 1。读取输入: 我们需要把那个由
'-'和'*'组成的字符串读进来。遍历与计算: 这是最关键的一步!我们要从字符串的第一个字符开始,一直到最后一个字符,对每个字符进行判断和计算。
- 我们可以用一个循环来做到这一点。
- 在循环的每一步,我们取出当前位置的字符。
- 然后用
if-else语句来判断:- 如果这个字符是
'*',我们就执行sum = sum * 2。 - 如果这个字符是
'-',我们就执行sum = sum - 1。
- 如果这个字符是
举个例子来加深理解,喵~ 假设输入的字符串是 s = "*-*":
- 开始:
sum的初始值是1。 - 第1个字符
'*':sum变成了1 * 2 = 2。 - 第2个字符
'-':sum变成了2 - 1 = 1。 - 第3个字符
'*':sum变成了1 * 2 = 2。
字符串遍历结束!我们得到的最终 sum 是 2。
- 最终判断: 在循环结束,也就是整个字符串都处理完毕后,我们得到了一个最终的
sum值。现在,我们只需要比较一下这个sum和2025的大小关系。- 如果
sum >= 2025,就说明我们成功啦,输出YES。 - 否则,就说明还差一点点,输出
NO。
- 如果
看吧,整个过程就像是小猫咪跟着毛线球滚动一样,思路非常直接。我们只需要把这个过程翻译成代码就大功告成啦!
代码实现
下面是我根据上面的思路,精心为你准备的一份C++代码。我用了 std::string 和范围 for 循环,这样代码看起来更整洁易懂哦,喵~
#include <iostream>
#include <string>
#include <vector>
// 主函数入口,喵~
int main() {
// 为了让输入输出更快一点,这是一个小魔法哦!
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
// 定义一个字符串变量 s 来存储输入的指令
std::string s;
std::cin >> s;
// 题目要求初始数字是 1,我们用一个 long long 类型的变量来存,防止数字变得太大
// 虽然题目说字符串长度不超过20,int 也能存下,但用 long long 是个好习惯~
long long sum = 1;
// 使用范围for循环,依次遍历字符串 s 中的每一个字符 c
// 这种写法很优雅,推荐给大家的说!
for (char c : s) {
if (c == '*') {
// 如果是 '*',就将 sum 乘以 2
sum *= 2;
} else if (c == '-') {
// 如果是 '-',就将 sum 减去 1
sum -= 1;
}
}
// 循环结束后,判断最终的 sum 是否大于等于 2025
if (sum >= 2025) {
std::cout << "YES" << std::endl;
} else {
std::cout << "NO" << std::endl;
}
// 程序顺利结束,返回0
return 0;
}复杂度分析
时间复杂度: 这里的 是输入字符串的长度。因为我们的代码只对字符串进行了一次从头到尾的遍历,所以花费的时间和字符串的长度是成正比的,记作 。对于这道题, ,所以速度快得像风一样,喵~
空间复杂度: 我们主要需要空间来存储输入的字符串
s,其长度为 。除此之外,我们只用到了像sum这样的几个固定大小的变量,它们的空间是常数级别的,即 。所以总的空间复杂度主要取决于输入字符串的存储,为 。
知识点总结
这道题虽然简单,但也是练习基本功的好机会呐!我们可以从中复习到:
- 模拟思想: 编程的核心能力之一就是将现实世界或题目描述的规则,一步步地用代码实现出来。
- 字符串处理: 学会如何读取和遍历一个字符串是基本操作。C++中的
std::string和范围for循环 (for (char c : s)) 是非常现代和方便的工具。 - 条件分支:
if-else语句是控制程序流程的基石,用于根据不同的条件执行不同的代码块。 - 变量与数据类型: 选择合适的变量(如
long long)来存储计算过程中的数值,可以避免意想不到的溢出错误,这是一个好习惯哦!
希望这篇题解能帮到你!如果还有其他问题,随时可以来找我哦,喵~