CS-Wiki CS-Wiki
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
Home
知识体系总览
  • 数据结构与算法
  • 计算机网络
  • 操作系统
  • MySQL
  • Redis
  • 设计模式
  • Java 基础
  • Java 集合
  • Java 并发
  • Java 虚拟机
  • Spring
  • Kafka
  • 校招扫盲
  • 项目推荐
  • 唠唠嗑儿
  • 读书笔记
归档
GitHub (opens new window)
  • 刷题模板汇总
  • 一些刷题小技巧
  • 整数 and 位运算

  • 数组

  • 链表

  • 哈希表

  • 字符串

    • 修改大小写
    • 验证 IP 地址
    • 字符串转换整数 (atoi)
      • 📃 题目描述
      • 🔔 解题思路
      • 💥 复杂度分析
    • KMP算法

  • 栈

  • 队列

  • 二叉树

  • 前缀树

  • 二分查找

  • 双指针法

  • 区间求和问题

  • 排序

  • 回溯算法

  • 贪心算法

  • 动态规划

  • 图

  • 数学

  • 自动机

  • 海量数据和空间限制

  • 05-数据结构与算法
  • 字符串
小牛肉
2022-08-23
目录

字符串转换整数 (atoi)

# 📃 题目描述

题目链接:https://leetcode.cn/problems/string-to-integer-atoi/

# 🔔 解题思路

需要考虑以下几种情况:

1)去掉前导 0

2)去掉前导 0 后的第一个字符,判断是否是符号位(题目要求:如果不存在符号位,则假定结果为正)

3)处理数字字符

  • 如果读取到非数字字符,直接返回(题目要求:读入下一个字符,直到到达下一个非数字字符或到达输入的结尾)

  • 数字需要保持在 int 范围内

    // 执行 sum = sum * 10 + sign * num
    if (sign == -1) {
        // 负数
        if (sum < Integer.MIN_VALUE / 10 || 
            (sum == Integer.MIN_VALUE / 10 && -num < Integer.MIN_VALUE % 10)) {
            return Integer.MIN_VALUE;
        }
    }
    else {
        // 正数
        if (sum > Integer.MAX_VALUE / 10 || 
            (sum == Integer.MAX_VALUE / 10 && num > Integer.MAX_VALUE % 10)) {
            return Integer.MAX_VALUE;
        }
    }
    
  • 合法的情况下,才考虑转换

class Solution {
    public int myAtoi(String s) {
        int i = 0;

        // 1. 去掉前导 0
        for (; i < s.length(); i ++) {
            if (s.charAt(i) != ' ') {
                break;
            }
        }

        // 极端情况 
        if (i == s.length()) {
            return 0;
        }

        int sign = 1;
        char firstChar = s.charAt(i);
        // 2. 处理符号位(题目要求:如果不存在符号位,则假定结果为正)
        if (firstChar == '-') {
            sign = -1;
            i ++;
        }
        else if (firstChar == '+') {
            i ++;
        }

        // 3. 处理数字字符
        int sum = 0;
        for(; i < s.length(); i ++) {
            char cur = s.charAt(i);
            // 3.1 读取到非数字字符,直接返回(题目要求:读入下一个字符,直到到达下一个非数字字符或到达输入的结尾)
            if (!Character.isDigit(cur)) {
                return sum;
            } 

            int num = cur - '0';

            // 3.2 数字需要保持在 int 范围内
            if (sign == -1) {
                // 负数
                if (sum < Integer.MIN_VALUE / 10 || 
                    (sum == Integer.MIN_VALUE / 10 && num > -(Integer.MIN_VALUE % 10))) {
                    return Integer.MIN_VALUE;
                }
            }
            else {
                // 正数
                if (sum > Integer.MAX_VALUE / 10 || 
                    (sum == Integer.MAX_VALUE / 10 && num > Integer.MAX_VALUE % 10)) {
                    return Integer.MAX_VALUE;
                }
            }

             // 3.3 合法的情况下,才考虑转换,记得把符号位乘进去
            sum = sum * 10 + sign * num;
        }

        return sum;
    }
}

# 💥 复杂度分析

  • 空间复杂度:
  • 时间复杂度:

🎁 公众号

各位小伙伴大家好呀,叫我小牛肉就行,目前在读东南大学硕士,上方扫码关注公众号「飞天小牛肉」,与你分享我的成长历程与技术感悟~

帮助小牛肉改善此页面 (opens new window)
Last Updated: 2023/02/16, 11:27:10
验证 IP 地址
KMP算法-实现 strStr()

← 验证 IP 地址 KMP算法-实现 strStr()→

最近更新
01
02
线上环境 CPU 使用率飙升如何快速排查?
03-05
03
面试官再跟你说中国没有根服务器,雪人计划让他了解下
02-23
更多文章>
Theme by Vdoing | Copyright © 2019-2023 飞天小牛肉 | 皖ICP备2022008966号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式