刷题的日常-检查句子中的数字是否递增

109 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 19 天,点击查看活动详情

刷题的日常-2023年2月21号

一天一题,保持脑子清爽

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

来自leetcode的 2042 题,题意如下:

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

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

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

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

理解题意

通过题意,我们可以将信息整理如下:

  • 题目给出一个字符串
  • 字符串由字母、空格以及数字字符组成
  • 我们需要判断由空格分割之后,将数字字符表示的数字提取出来
  • 如果数字是严格递增的,返回 true,否则返回 false

做题思路

既然要求的是比较数字,那么就只需要提取数字字符就可以了。步骤如下:

  • 循环遍历字符串中的字符
  • 如果不是数字字符,直接跳过
  • 如果遇到数字字符,将数字字符提取
  • 比较前一个字符和当前字符的大小,如果不是严格递增,返回false
  • 最后肯定是满足题意的,返回 true 即可

代码实现

代码实现如下:

public class Solution {
    public boolean areNumbersAscending(String s) {
        int idx = 0, pre = -1, curr;
        char c;
        while (idx < s.length()) {
            c = s.charAt(idx++);
            if (!Character.isDigit(c)) {
                continue;
            }
            curr = c - '0';
            while (idx < s.length()) {
                c = s.charAt(idx++);
                if (!Character.isDigit(c)) {
                    break;
                }
                curr *= 10;
                curr += c - '0';
            }
            if (curr <= pre) {
                return false;
            }
            pre = curr;
        }
        return true;
    }
}

image.png