题目
从包含杂乱文本的字符串中,提取出其中的第一个有效十进制整数并输出(实现简易版的 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