📜  门| GATE IT 2006 |问题24(1)

📅  最后修改于: 2023-12-03 15:12:38.903000             🧑  作者: Mango

门 | GATE IT 2006 | 问题24

题目描述

给定一个字符串,判断它是否是一个合法的十进制数。

输入格式

一行字符串,长度不超过100。

输出格式

如果字符串是一个合法的十进制数,输出 Valid;否则,输出 Invalid

样例输入1
123.45
样例输出1
Invalid
样例输入2
0.1024
样例输出2
Valid
解题思路

十进制数的格式一般为 [整数部分].[小数部分] 的形式,其中小数部分可以省略。

因此,我们只需要分别判断整数部分和小数部分是否合法即可。

判断整数部分是否合法需要满足以下条件:

  • 整数部分可以是一个正数或者负数;
  • 如果整数部分以负号 - 开头,那么 - 的后面必须包含至少一位数字;
  • 如果整数部分以正号 + 开头,那么 + 的后面必须包含至少一位数字;
  • 如果整数部分既不以 + 也不以 - 开头,那么它必须以至少一位数字开头。

判断小数部分是否合法也需要满足以下条件:

  • 如果存在小数点 .,那么小数点前面和后面必须分别是一个合法的整数;
  • 如果小数点前面或者后面存在符号 +-,那么它们必须是第一位,并且后面必须有至少一位数字。
参考代码
def is_valid_decimal(s: str) -> str:
    # 先将字符串按小数点分成整数部分和小数部分
    int_part, decimal_part = s.split('.', maxsplit=1) if '.' in s else (s, '')

    # 判断整数部分是否合法
    if len(int_part) == 0:            # 整数部分不能为空
        return 'Invalid'
    elif int_part[0] in ('+', '-'):   # 如果存在符号,判断后面必须有数字
        if len(int_part) == 1 or not int_part[1:].isdigit():
            return 'Invalid'
    elif not int_part.isdigit():      # 如果不存在符号,整数部分必须是合法数字
        return 'Invalid'

    # 判断小数部分是否合法
    if len(decimal_part) == 0:
        return 'Valid'
    elif not decimal_part.isdigit() or len(decimal_part) == 0:     # 小数部分必须是合法数字
        return 'Invalid'
    elif decimal_part[0] in ('+', '-') and len(decimal_part) == 1: # 符号后面必须有数字
        return 'Invalid'
    else:
        return 'Valid'
时间复杂度

由于字符串的长度不超过100,因此算法的时间复杂度为 $O(1)$。