题目

从包含杂乱文本的字符串中,提取出其中的第一个有效十进制整数并输出(实现简易版的 atoi)。若未包含数字输出 0。

输入格式:输入一行可能包含前导空白、符号、字母与数字的混合字符串。

输出格式:输出提取出的带符号整数,末尾换行。

数据范围与约定:字符串长度不超过 200,数值在标准 32 位 int 范围内。

思路与算法

1. 跳过前导空白
指针遍历跳过空格、制表符等字符:while (isspace(*p)) p++;。

2. 正负号判断与累乘
检查是否存在 + 或 - 符号,记录符号位 sign 并前进一位。随后循环读取连续数字:val = val * 10 + (*p - '0');,遇到非数字字符即刻停止解析。

完整程序

import java.util.Scanner;

public class Main {
    // 简易 atoi:跳过前导空白,解析正负号与连续数字
    public static int myAtoi(String s) {
        int i = 0;
        int n = s.length();
        // 1. 跳过前导空白
        while (i < n && Character.isWhitespace(s.charAt(i))) {
            i++;
        }
        if (i >= n) return 0;

        // 2. 识别符号位
        int sign = 1;
        if (s.charAt(i) == '+') {
            i++;
        } else if (s.charAt(i) == '-') {
            sign = -1;
            i++;
        }

        // 3. 提取连续数字
        long val = 0;
        while (i < n && Character.isDigit(s.charAt(i))) {
            val = val * 10 + (s.charAt(i) - '0');
            i++;
        }

        return (int) (sign * val);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.hasNextLine() ? sc.nextLine().trim() : "";
        System.out.println(myAtoi(s));
    }
}

运行示例

输入:

-42abc

输出:

-42