博客
关于我
LeetCode: String to Integer (atoi)
阅读量:797 次
发布时间:2023-01-31

本文共 3100 字,大约阅读时间需要 10 分钟。

实现C语言中的 atoi 函数:处理不同输入情况

问题描述

C语言中的 atoi 函数用于将字符串转换为整数。但在实现这一功能时,需要考虑多种不同的输入情况。这些情况包括处理空白字符、符号、数字以及其他无效字符。

分析输入情况

在实现 atoi 函数之前,我们需要考虑以下几种输入情况:

  • 空字符串或 null:如果输入的字符串是空的或 null,函数应返回0。
  • 非空字符:首先需要跳过前导空白字符,直到遇到第一个非空白字符。
  • 符号字符:符号字符可以是+-,可以出现在字符串的开头。
  • 数字符号:数字符号只能从0到9组成,可以有多个数字符号。
  • 无效字符:如果字符串中存在其他字符(如字母),则无法转换为有效的整数。
  • 溢出处理:如果转换后的数值超过整数的范围,则返回 INT_MAXINT_MIN
  • 科学计数法:虽然这可能超出了本题的要求,但需要注意不要误解这样形式的字符串。
  • 多个符号字符:如++2+--2等,应认为是无效的输入。
  • 编写函数步骤

  • 空字符串检查:首先检查输入的字符串是否为空。如果是空的,返回0。
  • 空白符处理:忽略字符串中的前导空白符,直到遇到第一个非空白符。
  • 符号字符处理:检查当前字符是否是符号。如果是,将符号保存下来,继续处理后续数字部分。如果有多个符号字符出现,视为无效输入,返回0。
  • 数字符号处理:逐个处理数字符号,将它们组合成一个整数值。
  • ** oversees cases**:检查是否存在多个符号字符或其他无效字符,视为无效输入。
  • 溢出处理:在处理到最大或最小值时,返回 INT_MAXINT_MIN
  • 返回结果:若所有字符都已处理且为有效数值,则返回整数值。否则,返回0。
  • 代码实现

    public class Atoi {    public static int atoi(String str) {        // Null或空字符串        if (str == null || str.isEmpty()) {            return 0;        }        // 去空白符        String trimmedStr = str.trim();        if (trimmedStr.isEmpty()) {            return 0;        }        int result = 0;        boolean sign = true; // 正数,false为负数        int index = 0;        // 遍历字符串        for (int i = 0; i < trimmedStr.length(); i++) {            char c = trimmedStr.charAt(i);                        // 检查是否是符号            if (c == '+' || c == '-') {                if (sign) { // 符号只能出现一次                    sign = false;                    index = i + 1;                } else {                    // 多个符号符号,返回零                    return 0;                }            } else if (Character.isLetterOrDigit(c) || c == ' ') { // 有字母或数字或空白符                continue;            } else {                // 遇到其他字符,返回零                return 0;            }            // 处理数字            try {                int number = Character.getNumericValue(c);                result = result * 10 + number;                                // 检查是否溢出                if (result > Integer.MAX_VALUE && sign) {                    return Integer.MAX_VALUE;                }                if (result < Integer.MIN_VALUE && !sign) {                    return Integer.MIN_VALUE;                }            } catch (NumberFormatException e) {                // 当字符不是数字时,抛出异常,但逻辑上这里不应该出现                return 0;            }        }        return result;    }    // 测试代码    public static void main(String[] args) {        System.out.println(atoi("123")); // 123        System.out.println(atoi("-123")); // -123        System.out.println(atoi("+456")); // 456        System.out.println(atoi("  789")); // 789        System.out.println(atoi("   -012")); // 12,因为前导零没有意义        System.out.println(atoi("abc")); // 0        System.out.println(atoi("+")); // 0        System.out.println(atoi("++123")); // 0        System.out.println(ато("+2"));//2        System.out.println(arti("2")); //2    }}

    代码解释

    • 空字符串检查:在开头检查输入字符串是否为 null 或空的,返回0。
    • 去空白符:使用 trim 方法去除字符串前后的空白符,处理为空的情况。
    • 符号处理:遍历字符,如果遇到符号检查是否是第一个符号,如果是,则继续处理后续字符。多个符号则返回0。
    • 数字符号处理:遇到有效的数字符号,逐步构建数值。使用Character.getNumericValue获取数字符号的数值。
    • 溢出处理:在处理大数字时,检查是否超过了最大值或最小值,根据符号返回相应的值。
    • 返回结果:如果遍历结束后所有字符都是有效的数字符号,则返回结果,否则返回0。

    这个实现尽量覆盖了大部分可能的输入情况,包括了边界情况处理,并通过测试确认能够正确转换各种有效的整数字符串。

    转载地址:http://rmgyk.baihongyu.com/

    你可能感兴趣的文章
    os.system 在 Python 中不起作用
    查看>>
    OS2ATC2017:阿里研究员林昊畅谈操作系统创新与挑战
    查看>>
    OSCACHE介绍
    查看>>
    SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum
    查看>>
    OSChina 周五乱弹 ——吹牛扯淡的耽误你们学习进步了
    查看>>
    OSChina 周四乱弹 ——程序员为啥要买苹果手机啊?
    查看>>
    OSChina 技术周刊第十期,每周技术抢先看!
    查看>>
    OSError: no library called “cairo-2“ was foundno library called “cairo“ was foundno library called
    查看>>
    Osgi环境配置
    查看>>
    OSG学习:几何体的操作(二)——交互事件、Delaunay三角网绘制
    查看>>
    OSG学习:几何对象的绘制(三)——几何元素的存储和几何体的绘制方法
    查看>>
    OSG学习:几何对象的绘制(二)——简易房屋
    查看>>
    OSG学习:几何对象的绘制(四)——几何体的更新回调:旋转的线
    查看>>
    OSG学习:场景图形管理(一)——视图与相机
    查看>>
    OSG学习:场景图形管理(三)——多视图相机渲染
    查看>>
    OSG学习:场景图形管理(二)——单窗口多相机渲染
    查看>>
    OSG学习:场景图形管理(四)——多视图多窗口渲染
    查看>>
    OSG学习:新建C++/CLI工程并读取模型(C++/CLI)——根据OSG官方示例代码初步理解其方法
    查看>>
    Sql 随机更新一条数据返回更新数据的ID编号
    查看>>
    OSG学习:空间变换节点和开关节点示例
    查看>>