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

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目

思考

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

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

由此产生了2个问题

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

如何提取正确的表达式

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

举个栗子

'abc+123' :

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

' -123 456'

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

对于如下字符串

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

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

类似于这样

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

指的注意的是

题目中关于整数取值范围

提交代码

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
}
posted @ 2022-03-30 13:40  pdudos  阅读(0)  评论(0)    收藏  举报  来源