跳至主要內容

2042. 检查句子中的数字是否递增


2042. 检查句子中的数字是否递增

🟢   🔖  字符串  🔗 力扣open in new window LeetCodeopen in new window

题目

A sentence is a list of tokens separated by a single space with no leading or trailing spaces. Every token is either a positive number consisting of digits 0-9 with no leading zeros, or a word consisting of lowercase English letters.

  • For example, "a puppy has 2 eyes 4 legs" is a sentence with seven tokens: "2" and "4" are numbers and the other tokens such as "puppy" are words.

Given a string s representing a sentence, you need to check if all the numbers in s are strictly increasing from left to right (i.e., other than the last number, each number is strictly smaller than the number on its right in s).

Return true if so, orfalse otherwise.

Example 1:

example-1
example-1

Input: s = "1 box has 3 blue 4 red 6 green and 12 yellow marbles"

Output: true

Explanation: The numbers in s are: 1, 3, 4, 6, 12.

They are strictly increasing from left to right: 1 < 3 < 4 < 6 < 12.

Example 2:

Input: s = "hello world 5 x 5"

Output: false

Explanation: The numbers in s are: 5 , 5. They are not strictly increasing.

Example 3:

example-3
example-3

Input: s = "sunset is at 7 51 pm overnight lows will be in the low 50 and 60 s"

Output: false

Explanation: The numbers in s are: 7, 51 , 50 , 60. They are not strictly increasing.

Constraints:

  • 3 <= s.length <= 200
  • s consists of lowercase English letters, spaces, and digits from 0 to 9, inclusive.
  • The number of tokens in s is between 2 and 100, inclusive.
  • The tokens in s are separated by a single space.
  • There are at least two numbers in s.
  • Each number in s is a positive number less than 100, with no leading zeros.
  • s contains no leading or trailing spaces.

题目大意

句子是由若干 token 组成的一个列表,token 间用 单个 空格分隔,句子没有前导或尾随空格。每个 token 要么是一个由数字 0-9 组成的不含前导零的 正整数 ,要么是一个由小写英文字母组成的 单词

  • 示例,"a puppy has 2 eyes 4 legs" 是一个由 7 个 token 组成的句子:"2""4" 是数字,其他像 "puppy" 这样的 tokens 属于单词。

给你一个表示句子的字符串 s ,你需要检查 s 中的 全部 数字是否从左到右严格递增(即,除了最后一个数字,s 中的 每个 数字都严格小于它 右侧 的数字)。

如果满足题目要求,返回 true ,否则,返回 false

示例 1:

example-1
example-1

输入: s = "1 box has 3 blue 4 red 6 green and 12 yellow marbles"

输出: true

解释: 句子中的数字是:1, 3, 4, 6, 12 。

这些数字是按从左到右严格递增的 1 < 3 < 4 < 6 < 12 。

示例 2:

输入: s = "hello world 5 x 5"

输出: false

解释: 句子中的数字是: 5 , 5 。这些数字不是严格递增的。

示例 3:

example-3
example-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 。这些数字不是严格递增的。

示例 4:

输入: s = "4 5 11 26"

输出: true

解释: s 中的数字是:4, 5, 11, 26 。

这些数字是按从左到右严格递增的:4 < 5 < 11 < 26 。

提示:

  • 3 <= s.length <= 200
  • s 由小写英文字母、空格和数字 09 组成(包含 09
  • s 中数字 token 的数目在 2100 之间(包含 2100
  • s 中的 token 之间由单个空格分隔
  • s 中至少有 两个 数字
  • s 中的每个数字都是一个 小于 100 数,且不含前导零
  • s 不含前导或尾随空格

解题思路

  1. 提取数字

    • 使用正则表达式 /\d{1,2}/ig 匹配所有 1 到 2 位的数字。
    • match 方法会返回一个匹配到的数字字符串数组。
  2. 验证递增

    • 遍历提取的数字数组。
    • 将每个数字字符串转为数字并比较当前数字和前一个数字。
    • 如果当前数字小于或等于前一个数字,返回 false
    • 如果全部数字严格递增,返回 true

复杂度分析

  • 时间复杂度O(m)
    • 正则匹配数字:O(n),其中 n 是字符串长度。
    • 遍历数字数组:O(m),其中 m 是提取的数字个数。
    • 总时间复杂度为 O(n)
  • 空间复杂度O(m),正则匹配产生了一个数组,其中 m 是提取的数字个数。

代码

/**
 * @param {string} s
 * @return {boolean}
 */
var areNumbersAscending = function (s) {
	let arr = s.match(/\d{1,2}/gi); // 匹配1到2位的数字
	for (let i = 1; i < arr.length; i++) {
		// 检查递增
		if (Number(arr[i]) <= Number(arr[i - 1])) return false;
	}
	return true;
};

相关题目

题号标题题解标签难度力扣
8字符串转换整数 (atoi)[✓]字符串🟠🀄️open in new window 🔗open in new window
1859将句子排序[✓]字符串 排序🟢🀄️open in new window 🔗open in new window
2124检查是否所有 A 都在 B 之前[✓]字符串🟢🀄️open in new window 🔗open in new window