力扣 8. 字符串转换整数 (atoi) 解题

简介: 力扣 8. 字符串转换整数 (atoi) 解题

题目


image.png

image.png



思考


该问题想表达的是在字符串中,寻找数字(可能是负数),就那些组装,返回整数

我们可以提取 正负数符号 和 满足需求的 数字


由此产生了2个问题


  1. 如何提取正确的表达式
  2. 对已经提取了的表达式如何计算其值




如何提取正确的表达式


正确的表达式应当由: 空格' ' / 负号- / 加号+ / 以及 数字构成,其余的,都不应该算作正确的表达式,且空格仅仅有前置


举个栗子


'abc+123' :

是不存在正确的表达式,因为是前置是非 空格' ' / 负号- / 加号+ / 以及 数字构成

' -123 456'

正确的表达式应该是 -123 , 因为前置空格可以忽略,后置遇到空格直接退出即可

对于如下字符串

image.png


根据上诉例子,我们可以编写如下伪代码

for 字符 range 字符数组
    if 字符 == 空格
        没有记录过任何表达式
        continue
    else 
        退出
    if 字符 == 负号
        if 表达式已经被标记过符号
            退出
        标记整个字符串为负数
        负号标记
    if 字符 == 加号
       if 表达式已经被标记过符号
           退出
        标记整个字符串为负数
        加号标记
    if 字符 满足 1 - 9 
        记录数字
输出 记录的数字 和 符号



编写提取表达式代码

func myAtoi(str string) {
  expression := make([]byte,0)
  negative := false
  symbol := false
  fuckoj := false
  for i:=0;i<len(str);i++ {
    if ' ' == str[i] {
      if 0 != len(expression) || fuckoj {
        break
      } else if negative {
        break
      } else if symbol || fuckoj {
        break
      }
      continue
    } else if '-' == str[i] {
      if 0 != len(expression) || fuckoj {
        break
      } else {
        if symbol || fuckoj {
          break
        }
        symbol = true
        negative = true
      }
    } else if '+' == str[i] {
      if 0 != len(expression) || fuckoj {
        break
      } else  {
        if symbol {
          break
        }
        symbol =  true
        continue
      }
    } else if str[i] >= 48 && str[i] <= 57 {
      if 48 == str[i] {
        fuckoj = true
        if 0 == len(expression) {
          continue
        }
      }
      expression = append(expression, str[i])
    } else {
      break
    }
  }
    fmt.Print(str," ")
  if 0 == len(expression) {
    fmt.Print("没有表达式")
  }
  if negative {
    fmt.Print("符号为- ")
  } else {
    fmt.Print("符号为+ ")
  }
  fmt.Println("表达式为: " , string(expression))
}



我们带入上诉字符串,得到结果

abc+-123 789 没有表达式符号为+ 表达式为:  
-123 789 符号为- 表达式为:  123
    -123 789 符号为- 表达式为:  123



对已经提取了的表达式如何计算其值


该问题可以理解为这样

123 = 3 * 1 + 2 * 10 + 1 * 100

类似于这样

image.png

再根据其正数 和 负数 符号来判断是 正数 还是 负数

指的注意的是

题目中关于整数取值范围

image.png


提交代码

func myAtoi(str string) int {
  expression := make([]byte,0)
  negative := false
  result := make([]int,0)
  symbol := false
    fuckoj := false
  for i:=0;i<len(str);i++ {
    if ' ' == str[i] {
      if 0 != len(expression) || fuckoj {
        break
      } else if negative {
        break
      } else if symbol || fuckoj {
        break
      }
      continue
    } else if '-' == str[i] {
      if 0 != len(expression) || fuckoj {
        break
      } else {
        if symbol || fuckoj {
          break
        }
        symbol = true
        negative = true
      }
    } else if '+' == str[i] {
      if 0 != len(expression) || fuckoj {
        break
      } else  {
        if symbol {
          break
        }
        symbol =  true
        continue
      }
    } else if str[i] >= 48 && str[i] <= 57 {
      if 48 == str[i] {
        fuckoj = true
        if 0 == len(expression) {
          continue
        }
      }
      expression = append(expression, str[i])
    } else {
      break
    }
  }
  if 0 == len(expression) {
    return 0
  }
  for k:=0;k<len(expression);k++ {
    result = append(result, int(expression[k]) - 48)
  }
    if 10 < len(result) {
    if negative {
      return -2147483648
    } else {
      return 2147483647
    }
  }
  jinzhi := 1
  sum := 0
  for j:=len(result)-1;j>=0;j-- {
    if sum >= 2147483648 {
      if negative {
        return -2147483648
      } else {
        return 2147483647
      }
    }
    sum = sum + result[j] * jinzhi
    jinzhi = jinzhi * 10
  }
  if negative {
    sum = sum * -1
  }
  if sum >= 2147483647 {
    sum = 2147483647
  }
  if sum <= -2147483648 {
    sum = -2147483648
  }
  return sum
}



相关文章
|
2月前
|
存储
LeetCode整数反转
解决LeetCode上的整数反转问题的几种方法,包括错误的方法和优化后的解决方案,以及如何避免反转后的整数超出32位有符号整数范围的问题。
44 1
|
2月前
|
人工智能 自然语言处理 程序员
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
欢迎来到工程师令狐小哥的频道。本文介绍如何利用AI工具高效刷LeetCode,通过通义灵码插件在IntelliJ IDEA中实现代码生成、优化、单元测试等功能,提升编程学习效率。
87 1
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
|
2月前
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
37 1
|
2月前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
25 9
|
2月前
|
存储 C++
Leetcode第十二题(整数转罗马数字)
LeetCode第12题“整数转罗马数字”的解题方法,包括罗马数字的基本规则和特殊规则,以及如何使用C++实现整数到罗马数字的转换。
20 0
|
2月前
|
C++
Leetcode第十三题(罗马数字转整数)
这篇文章介绍了LeetCode第13题“罗马数字转整数”的解题方法,通过一个C++的类`Solution`中的`romanToInt`函数来实现,该函数使用哈希表和遍历字符串的方法,根据罗马数字的规则将输入的罗马数字字符串转换为对应的整数值。
56 0
|
2月前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
21 0
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
63 6
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
125 2