2 条题解
-
0
虽说这道题看起来有点复杂,但也可以用史山过,先定一个字符串,再用n或许它的长度,进行一次特判。因为如果长度是一的话,for循环后面不会运行。之后在每个字符串判定。
#include<iostream> #include<string> using namespace std; int main(){ int n; string s; cin>>s; n=s.size(); if(n==1){ cout<<"Yes"; return 0; } for(int i=0;i<=n-2;i++){ if(s[i]<=s[i+1]){ cout<<"No"; return 0; } } cout<<"Yes"; return 0; } -
0
📝 题目大意
给定一个正整数 (),判断它是否为"321-like Number"——即从高位到低位,每一位数字严格单调递减。一位数总是满足条件。
💡 解题思路
- 题目分析: 最大只有 (5 位),直接逐位检查即可,无需任何优化。约束中的小范围暗示了 的朴素算法完全足够。
- 算法推导:
- 将 以字符串
s读入,方便逐位访问。 - 初始化标志
is_valid = true。 - 从第 2 位(
i = 1)开始遍历到末尾,若s[i] >= s[i - 1](当前位不小于前一位),说明不满足严格递减,标记is_valid = false并退出循环。 - 最后根据
is_valid输出"Yes"或"No"。
- 将 以字符串
- 边界与细节:
- 一位数:
s.size() == 1时循环体不执行,is_valid保持true,正确输出"Yes"。 - 字符比较:直接用
s[i] >= s[i - 1]比较字符是安全的,因为数字字符 '0'~'9' 的 ASCII 码顺序与数值大小一致。 - WA 陷阱:注意条件是严格递减,必须用
>=判断非法(相等也不允许),若误写为>则会在相邻相等时误判为合法。
- 一位数:
⏱️ 复杂度分析
- 时间复杂度:,其中 是 的位数,最坏 。
- 空间复杂度:,仅存储一个字符串(最多 5 个字符)。
💻 标准代码 (C++)
#include <iostream> #include <string> using namespace std; int main() { string s; cin >> s; // 以字符串读入,方便逐位比较 bool is_valid = true; // 标记是否满足 321-like for (int i = 1; i < s.size(); ++i) { if (s[i] >= s[i - 1]) { // 当前位不小于前一位,违反严格递减 is_valid = false; break; // 一旦发现不满足,直接退出 } } if (is_valid) { cout << "Yes" << endl; } else { cout << "No" << endl; } return 0; }
- 1
信息
- ID
- 745
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 2
- 已通过
- 2
- 上传者