力扣 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
}



相关文章
|
1月前
|
Go 索引
【LeetCode 热题100】394:字符串解码(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 394:字符串解码。题目要求对编码字符串如 `k[encoded_string]` 进行解码,其中 `encoded_string` 需重复 `k` 次。文章提供了两种解法:使用栈模拟和递归 DFS,并附有 Go 语言实现代码。栈解法通过数字栈与字符串栈记录状态,适合迭代;递归解法则利用函数调用处理嵌套结构,代码更简洁。两者时间复杂度均为 O(n),但递归需注意栈深度问题。文章还总结了解题注意事项及适用场景,帮助读者更好地掌握字符串嵌套解析技巧。
49 6
|
2月前
|
存储 机器学习/深度学习 缓存
🚀 力扣热题 394:字符串解码(详细解析)(Go语言版)
文章提供了两种解法:栈结构和递归解法。栈解法通过维护数字栈与字符串栈,依次处理 `[` 和 `]`,构造解码结果;递归解法则利用函数调用逐层解析嵌套结构。两者时间复杂度均为 $O(n)$,空间复杂度也为 $O(n)$。栈解法直观易懂,适合初学者;递归解法优雅简洁,适合处理深度嵌套规则。掌握这两种方法,可灵活应对类似问题,提升解题能力。
82 11
|
7月前
|
人工智能 自然语言处理 程序员
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
欢迎来到工程师令狐小哥的频道。本文介绍如何利用AI工具高效刷LeetCode,通过通义灵码插件在IntelliJ IDEA中实现代码生成、优化、单元测试等功能,提升编程学习效率。
259 1
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
|
7月前
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
69 1
|
7月前
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
55 9
|
7月前
|
存储 C++
Leetcode第十二题(整数转罗马数字)
LeetCode第12题“整数转罗马数字”的解题方法,包括罗马数字的基本规则和特殊规则,以及如何使用C++实现整数到罗马数字的转换。
51 0
|
7月前
|
C++
Leetcode第十三题(罗马数字转整数)
这篇文章介绍了LeetCode第13题“罗马数字转整数”的解题方法,通过一个C++的类`Solution`中的`romanToInt`函数来实现,该函数使用哈希表和遍历字符串的方法,根据罗马数字的规则将输入的罗马数字字符串转换为对应的整数值。
108 0
|
7月前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
64 0
|
8月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
111 6
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
9月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
198 2

热门文章

最新文章