Easy
题目描述
句子是由单个空格分隔的一系列标记,没有前导或尾随空格。每个标记要么是由数字 0-9 组成的正数(没有前导零),要么是由小写英文字母组成的单词。
例如,“a puppy has 2 eyes 4 legs” 是一个有七个标记的句子:“2” 和 “4” 是数字,其他标记如 “puppy” 是单词。
给定一个表示句子的字符串 s,你需要检查 s 中的所有数字是否从左到右严格递增(即除了最后一个数字外,每个数字都严格小于其右边的数字)。
如果是这样,返回 true,否则返回 false。
示例 1:
输入:s = "1 box has 3 blue 4 red 6 green and 12 yellow marbles"
输出:true
解释:s 中的数字是:1, 3, 4, 6, 12。
它们从左到右严格递增:1 < 3 < 4 < 6 < 12。
示例 2:
输入:s = "hello world 5 x 5"
输出:false
解释:s 中的数字是:5, 5。它们不是严格递增的。
示例 3:
输入:s = "sunset is at 7 51 pm overnight lows will be in the low 50 and 60 s"
输出:false
解释:s 中的数字是:7, 51, 50, 60。它们不是严格递增的。
约束:
- 3 <= s.length <= 200
- s 由小写英文字母、空格和数字 0-9 组成
- s 中的标记数在 2 到 100 之间
- s 中的标记由单个空格分隔
- s 中至少有两个数字
- s 中的每个数字都是小于 100 的正数,没有前导零
- s 不包含前导或尾随空格
解题思路
这道题的核心思路是解析字符串,提取其中的数字,并检查这些数字是否严格递增。
解题步骤:
- 字符串分割:将输入字符串按空格分割成多个标记(token)
- 数字识别:遍历每个标记,判断是否为数字。可以通过检查第一个字符是否为数字来判断
- 严格递增检查:维护一个变量记录前一个数字的值,每当遇到新数字时,比较它是否严格大于前一个数字
实现要点:
- 使用字符串分割功能将句子拆分为单词
- 对于每个单词,检查第一个字符是否为数字来判断是否为数字标记
- 将数字字符串转换为整数进行比较
- 如果某个数字不大于前一个数字,立即返回 false
时间复杂度分析:
- 需要遍历所有标记一次,每个标记的处理时间是常数
- 总体时间复杂度为 O(n),其中 n 是字符串长度
这种方法简洁高效,通过一次遍历即可完成判断。
代码实现
class Solution {
public:
bool areNumbersAscending(string s) {
istringstream iss(s);
string token;
int prevNum = 0;
while (iss >> token) {
if (isdigit(token[0])) {
int num = stoi(token);
if (num <= prevNum) {
return false;
}
prevNum = num;
}
}
return true;
}
};
class Solution:
def areNumbersAscending(self, s: str) -> bool:
tokens = s.split()
prev_num = 0
for token in tokens:
if token[0].isdigit():
num = int(token)
if num <= prev_num:
return False
prev_num = num
return True
public class Solution {
public bool AreNumbersAscending(string s) {
string[] tokens = s.Split(' ');
int prevNum = 0;
foreach (string token in tokens) {
if (char.IsDigit(token[0])) {
int num = int.Parse(token);
if (num <= prevNum) {
return false;
}
prevNum = num;
}
}
return true;
}
}
var areNumbersAscending = function(s) {
const tokens = s.split(' ');
let prevNum = 0;
for (const token of tokens) {
if (token[0] >= '0' && token[0] <= '9') {
const num = parseInt(token);
if (num <= prevNum) {
return false;
}
prevNum = num;
}
}
return true;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 需要遍历字符串中的每个字符一次,其中 n 是字符串长度 |
| 空间复杂度 | O(k) | 需要存储分割后的标记,其中 k 是标记的数量,在最坏情况下为 O(n) |
相关题目
. String to Integer (atoi) (Medium)
. Sorting the Sentence (Easy)