1.字母收集
题目大意
给定一个字符串,按顺序收集字母,尝试依次拿到a→b→c→…→z。 遇到当前需要的字母就收集,然后等待下一个字母; 求最多能收集到第几个字母(输出数量)。
举例: 输入:abacdef顺序匹配:a (1)→b (2),后面 a 跳过,c (3) d (4) e (5) f (6),输出 6。
C++ AC 代码
cpp
运行
#include <iostream> #include <string> using namespace std; int main() { string s; cin >> s; int now = 0; // 需要收集的字母偏移:0=a,1=b...25=z for (char c : s) { if (c - 'a' == now) { now++; } } cout << now << endl; return 0; }思路说明
now代表下一个想要收集的字母:- now=0 → 找 'a'
- now=1 → 找 'b'
- …
- now=26 代表集齐全部 26 个字母,可以提前终止(可选优化)
- 遍历字符串每个字符: 如果当前字符正好等于目标字母,
now++ - 最终
now就是收集到的字母总数。
简易优化版(集齐 26 个直接 break)
cpp
运行
#include <iostream> #include <string> using namespace std; int main() { string s; cin >> s; int now = 0; for (char c : s) { if (c - 'a' == now) { now++; if (now == 26) break; } } cout << now << endl; return 0; }2.添加逗号
题目描述
输入一个整数(正整数,无前置 0),从右往左每 3 位添加一个逗号,输出格式化后的字符串。 示例: 输入:1234→ 输出1,234输入:1234567→ 输出1,234,567输入:123→ 输出123
C++ AC 代码
cpp
运行
#include <iostream> #include <string> using namespace std; int main() { string s; cin >> s; int len = s.size(); string ans; // 先处理开头不足3位的部分 int first = len % 3; int pos = 0; if (first != 0) { ans += s.substr(pos, first); pos += first; if (pos < len) ans += ","; } // 每次截取3位 while (pos < len) { ans += s.substr(pos, 3); pos += 3; if (pos < len) ans += ","; } cout << ans << endl; return 0; }思路
- 数字当作字符串处理最简单,避免大数溢出;
- 算出最左侧第一段长度
len%3,模为 0 时代表第一段也是 3 位; - 依次截取,每段后面加逗号(最后一段不加)。
测试样例
123→1231234→1,234123456→123,4561234567→1,234,567
3.跳台阶
题目描述
一只青蛙一次可以跳上1 级台阶,也可以跳上2 级。 求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
递推分析
设 \(f(n)\) 为跳到第 n 阶的方案数
- 最后一步跳 1 阶:前面是 \(f(n-1)\)
- 最后一步跳 2 阶:前面是 \(f(n-2)\)
\(f(n) = f(n-1)+f(n-2)\)
边界:
- \(f(1) = 1\)
- \(f(2) = 2\)
数列:1,2,3,5,8,13……
C++ 迭代 AC 代码(推荐,无递归爆栈)
cpp
运行
#include <iostream> using namespace std; int main() { int n; cin >> n; if (n == 1) { cout << 1 << endl; return 0; } if (n == 2) { cout << 2 << endl; return 0; } long long a = 1, b = 2, c; for (int i = 3; i <= n; i++) { c = a + b; a = b; b = c; } cout << b << endl; return 0; }用
long long防止大数溢出!
递归写法(不推荐,n 大超时)
cpp
运行
#include <iostream> using namespace std; long long jump(int n) { if (n == 1) return 1; if (n == 2) return 2; return jump(n-1) + jump(n-2); } int main() { int n; cin >> n; cout << jump(n) << endl; return 0; }