• 【剑指offer】20.表示数值的字符串


    Python3

    本题参考:https://leetcode.cn/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/solution/jian-zhi-offer-20-biao-shi-shu-zhi-de-zi-060v/
    采用遍历字符串判断的方法,步骤如下:
    1.首先定义4个标志位,即:
     1.1 has_num,表示之前是否存在数字 0 − 9 0-9 09
     1.2 has_e,表示之前是否存在 e e e或者 E E E
     1.3 has_sign,表示之前是否存在 + + +或者 − -
     1.4 has_dot,表示之前是否存在小数点 . . .
    2.定义字符串长度n以及字符串索引index
    3.处理开头的空格,index相应地往后移
    4.进入循环,遍历字符串
     4.1 如果当前字符是数字:将has_num置为Trueindex往后移动,一直到非数字或者遍历到末尾位置,如果已经遍历到末尾(即index == n),结束循环
     4.2 如果当前字符是 e e e(或者 E E E):如果 e e e(或者 E E E)已经出现或者当前 e e e(或者 E E E)之前没有出现过数字,返回False,否则令has_eTrue,并且将其他3个标志位全部置为False,将has_numhas_sign置为False是因为 e e e(或者 E E E)后面需要跟上新的数字,将has_dot置为False是因为 e e e(或者 E E E)后面不能出现小数点 . . .
     4.3 如果当前字符是 + + +(或者 − - ):如果已经出现过 + + +(或者 − - )或者已经出现过数字或者已经出现过 . . .,返回False,否则令has_signTrue
     4.4 如果当前字符是 . . .:如果已经出现过 . . .或者已经出现过 e e e(或者 E E E),返回False,否则令has_dotTrue
     4.5 如果当前字符是除了上面4种情况以外的其他字符,返回False
    5.处理末尾的空格,index相应地往后移
    6.如果当前索引index与字符串长度n相等,说明遍历到了末尾,但还要满足has_numTrue才可以返回最终的True,因为如果字符串中全是符号没有数字是不行的,而且 e e e(或者 E E E)后面没有数字也是不行的,但是没有符号是可以的,所以4个标志位中只要判断has_num就行,最终返回has_num and index == n
    7.如果字符串中间存在空格,就跳出循环,按以上思路是无法遍历到末尾的,index不会与n相等,因此返回的就是False

    根据以上思路,代码如下:

    class Solution:
    	def isNumber(self, s: str) -> bool:
    		has_num = has_e = has_sign = has_dot = False
    		n, index = len(s), 0
    		while index < n and s[index] == ' ':
    			index += 1
    		while index < n:
    			if '0' <= s[index] <= '9':
    				has_num = True
    				if index == n:
    					break
    			elif s[index] == 'e' or s[index] == 'E':
    				if has_e or not has_num:
    					return False
    				has_e, has_num, has_sign, has_dot = True, False, False, False
    			elif s[index] == '+' or s[index] == '-':
    				if has_sign or has_num or has_dot:
    					return False
    				has_sign = True
    			elif s[index] == '.':
    				if has_dot or has_e:
    					return False
    				has_dot = True
    			elif s[index] == ' ':  # 如果字符串中间存在空格,那就跳出循环
    				break
    			else:
    				return False
    			index += 1
    		while index < n and s[index] == ' ':
    			index += 1
    		return has_num and index == n
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    时间复杂度分析

    本方法中存在3个while循环,但它们不是嵌套的关系,因此时间复杂度为 O ( n ) O(n) O(n)

  • 相关阅读:
    SQL-DML数据操纵语言(Oracle)
    27 - Excel 的基本公式和重要函数
    【哈士奇赠书活动 - 44期】- 〖从零基础到精通Flutter开发〗
    小程序毕设作品之微信体育馆预约小程序毕业设计成品(5)任务书
    LeetCode刷题---141. 环形链表(双指针-滑动窗口)
    Autosar MCAL-ICU输入捕获
    Android13 按键kl文件优先级详解
    Next.js Web 应用程序 SSG 与 SSR——选择正确的渲染方法
    cmake简洁教程 - 第三篇
    javaEE进阶 - Spring 的 Bean 作用域 和 生命周期 - 细节狂魔
  • 原文地址:https://blog.csdn.net/qq_15971883/article/details/125438079