题目

8、字符串转换整数(atoi)

思路

1、创建字符数组,定义结果变量 ans 为 0,符号变量 符号 初始化为 1(表示正数),以及一个标志 onlyNum 用于指示是否已经读取到数字。
2、遍历,如果 onlyNum 为 true,继续处理数字:如果当前字符是数字,将其转为相应的整数并累加到 ans,并每次乘以 10 来构建完整数字,返回前检查是否超出 Int32 的范围。
3、如果 onlyNum 为 false:

  • 忽略空格。
  • 如果是负号,设置符号为 -1,并将 onlyNum 设置为 true。
  • 如果是正号,设置符号为 1,并将 onlyNum 设置为 true。
  • 如果是数字,设置符号为 1,更新 ans 并设置 onlyNum 为 true。
  • 遇到其他无效字符时终止处理。

代码

class Solution {
    func myAtoi(s: String): Int64 {
        var rArr = s.toRuneArray()
        var ans:Int64 = 0
        var 符号 = 1
        var onlyNum = false
        for(r in rArr){
            if(onlyNum){
                if(r <= r'9' && r >= r'0'){
                    ans *= 10
                    ans += Int64(UInt32(r) - UInt32(r'0'))
                    // println("r = ${r}, ans = ${ans}")
                    if(ans > Int64(Int32.Max)){
                        if(符号 > 0){
                            return Int64(Int32.Max)
                        }
                        else{
                            return Int64(Int32.Min)
                        }
                    }
                }
                else{
                    break
                }
            }
            else{
                if(r == r' '){
                    // do nothing
                }
                else if(r == r'-'){
                    符号 = -1
                    onlyNum = true
                }
                else if(r == r'+'){
                    符号 = 1
                    onlyNum = true
                }
                else if(r <= r'9' && r >= r'0'){
                    符号 = 1
                    onlyNum = true
                    ans += Int64(UInt32(r) - UInt32(r'0'))
                }
                else{
                    break
                }
            }
        }
        return ans * 符号
    }
}

复杂度

时间复杂度:O(n)

空间复杂度:O(n)

遇到的坑

1、string不能slice,必须转arr

结果

cangjie

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐