首页 > 其他分享 >剑指offer_20230715

剑指offer_20230715

时间:2023-07-15 19:45:07浏览次数:35  
标签:状态 20230715 HashMap dight offer put new dot

剑指 Offer 67. 把字符串转换成整数

题目说明

写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。

首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。

当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。

该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。

注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。

在任何情况下,若函数不能进行有效的转换时,请返回 0。

假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

解题思路

从头到尾对字符串进行一个遍历操作。

  1. 对一开始的空格进行一个滤去处理

  2. 对第一个非空格字符进行符号判定,用sign记录。

  3. 对后续的数字进行遍历,直到第一个非数字出现

    • 通过res = res * 10 + str.charAt(index) - ’0‘来记录结果
    • res要与最大值进行比较判断,如果超限直接根据sign来返回Integer.MAX_VALUE或者Integer.MIN_VALUE。此处用到技巧,用(Integer.MAX_VALUE / 10)来和res进行比较,防止超限,之前前面进行比较,如果相等则比较最后一位和’7‘
  4. 返回sign * res

剑指 Offer 20. 表示数值的字符串

题目说明

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。

数值(按顺序)可以分成以下几个部分:

若干空格
一个 小数 或者 整数
(可选)一个 'e' 或 'E' ,后面跟着一个 整数
若干空格
小数(按顺序)可以分成以下几个部分:

(可选)一个符号字符('+' 或 '-')
下述格式之一:
至少一位数字,后面跟着一个点 '.'
至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字
一个点 '.' ,后面跟着至少一位数字
整数(按顺序)可以分成以下几个部分:

(可选)一个符号字符('+' 或 '-')
至少一位数字
部分数值列举如下:
["+100", "5e2", "-123", "3.1416", "-1E-16", "0123"]

部分非数值列举如下:
["12e", "1a3.14", "1.2.3", "+-5", "12e+5.4"]

解题思路

有限状态自动机

有限状态自动机(Finite State Machine,简称FSM),是一种用来表示和设计顺序逻辑电路、计算机程序,以及其他类型的行为的数学模型。有限状态自动机在理论计算机科学、语言研究、电脑科学、语言识别等领域都得到了广泛地应用。

一个有限状态自动机由以下组成:

  • 状态:这些是有限状态机的核心部分,代表系统的不同条件或配置。
  • 转移:这是从一个状态移动到另一个状态的规则或条件。这些转移可以基于输入或事件。
  • 起始状态:有限状态机开始工作时的状态。
  • 终止状态:这些状态表示有限状态机的结束或接受状态。当达到这些状态时,系统将停止运行。

有两类主要的有限状态自动机:

  1. 确定性有限状态自动机(Deterministic Finite Automaton,简称DFA):在这种类型的自动机中,对于给定的输入,每个状态只能转移到一个状态。
  2. 非确定性有限状态自动机(Nondeterministic Finite Automaton,简称NFA):在这种类型的自动机中,对于给定的输入,每个状态可能会转移到多个状态。

在本题中,我们可以应用这种思路来解决。如果用简单的遍历下去的话,会出现很多种分支已经情况,会导致代码逻辑非常复杂且出现冗余的情况。有限自动状态机可以有效的解决这个问题。

image-20230715191754226

在本题中,字符可以有六种情况(非左下图五种我们用’?‘表示,直接返回false即可),而这六种情况我们可以构成8种状态。如果要构成一个数字的话,我们是可以很明确的判定下一位可以是什么以及不可以是什么,基于此思想,我们产生了八种状态,而这八种状态以及他们的转换关系也就构成了有限状态自动机

我们根据以下的状态机定义来说明情况

Map[] maps = {
    new HashMap<>() { 
        // 0:起始blank -> blank, sign, dot前的dight, dot 
        {put('b', 0); put('s', 1); put('d', 2); put('.', 8);}},
    new HashMap<>() { // 1:e之前的sign -> dot前的dight, dot前为空(此处作此区分,如果前面为空的话后面不能为空)
        {put('d', 2); put('.', 8);}},
    new HashMap<>() { // 2: dot之前的dight -> 继续dot前的dight, dot前不为空, Ee, blank
        {put('d', 2); put('.', 3); put('e', 4); put('b', 7);}},
    new HashMap<>() { // 3: dot之后的dight -> 继续dot后的dight, Ee,blank
        {put('d', 3); put('e', 4);put('b', 7);}},
    new HashMap<>() { // 4: Ee -> sign, dot后的dight(Ee后面不能再有dot了)
        {put('s', 5); put('d', 6);}},
    new HashMap<>() { // 5: e之后的sign -> e之后的dight
        {put('d', 6);}},
    new HashMap<>() { // 6: e之后的dight -> 继续e之后的dight(不能再有dot了), blank
        {put('d', 6); put('b', 7);}},
    new HashMap<>() { // 7: 尾部blank -> 继续尾部blank
        {put('b', 7);}},
    new HashMap<>() { // 8: dot前为空的情况 -> 只能且必须去dot后dight(后面必须有dight)
        {put('d', 3);}}
};

把所有合法的转移情况都标记出来,那么如果下一步的转移是不合法的,则说明出问题了,该字符串不能构成数字

最后我们还需要判定合法结束状态,即有些状态是可以合法结束的,有些则不可以
在以上的情况中,只有状态2、状态3、状态6和状态7是合法的,即字符串可以构成数字

标签:状态,20230715,HashMap,dight,offer,put,new,dot
From: https://www.cnblogs.com/xccx-0824/p/17556775.html

相关文章

  • 【剑指Offer】3、从尾到头打印链表
    【剑指Offer】3、从尾到头打印链表题目描述:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。解题思路:(三种方法:借助栈、递归、列表的首位插入)从头到尾打印链表比较简单,从尾到头很自然的可以想到先将链表进行反转,然后再打印。但是,通常我们不希望改变原链表的结构,这是......
  • LeetCode 剑指 Offer 13. 机器人的运动范围
    题目链接:LeetCode剑指Offer13.机器人的运动范围题意:地上有一个m行n列的方格,从坐标[0,0]到坐标[m-1,n-1]。一个机器人从坐标[0,0]的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机......
  • 剑指 Offer 16. 数值的整数次方
    剑指Offer16.数值的整数次方这是在面试时候,无准备折腾除了的递归写法。classSolution{publicdoublemyPow(doublex,intn){//if(x==0)return0;//longb=if(n==0)return1.0;if(n==1)returnx;//把n为负......
  • 剑指offer
    《剑指Offer》读书笔记。感谢强哥给的书。希望明年的我也可以Offer满满~代码基本都在这里了:https://github.com/ixsim/OJProblemsP31单例模式classA{ staticAgetInstance();voidfunc();private:A();A(A&rth);~A();};AA::getInstance(){......
  • LeetCode 剑指 Offer 11. 旋转数组的最小数字
    题目链接:LeetCode剑指Offer11.旋转数组的最小数字题意:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [......
  • LeetCode 剑指 Offer 12. 矩阵中的路径
    题目链接:LeetCode剑指Offer12.矩阵中的路径题意:给定一个 mxn二维字符网格 board和一个字符串单词 word。如果 word存在于网格中,返回true;否则,返回false。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元......
  • 【剑指Offer】54、字符流中第一个不重复的字符
    【剑指Offer】54、字符流中第一个不重复的字符题目描述:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当......
  • LeetCode 剑指 Offer 08. 二叉树的下一个节点
    题目:二叉树的下一个节点给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。(树的后继)注意:如果给定的节点是中序遍历序列的最后一个,则返回空节点;二叉树一定不为空,且给定的节点一定不是空节点;解题思路二叉树的中序遍历:{[左子树],根节点,[右子树]}如图所示......
  • 金三银四喜提offer!秋招蚂蚁金服Java研发岗四面
     面试流程  先说下面试流程,一般大公司都有3-4轮技术面,1轮的HR面。就蚂蚁金服而言,我共经历了4轮技术面,前两轮主要是问基础和项目实现,第3轮是交叉面,两个面试官,主要是问项目实现和拓展。第4轮是部门老大面,主要就问一些架构、技术和业务的理解、个人发展比较抽象的东西了,现在基......
  • 上月成功拿到字节跳动offer,全靠我啃烂了这份最新面试题
    前言不论是校招还是社招都避免不了各种面试、笔试,如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有章可循的,我这个“有章可循”说的意思只是说应对技术面试是可以提前准备,所谓不打无准备的仗就是这个道理,以下为大家,描述了从面试准备到最后的拿到offer提供了非常详细的......