题目链接:https://www.nowcoder.com/practice/d11471c3bf2d40f38b66bb12785df47f
题目描述
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。传入的字符串可能有以下部分组成:
若干空格
(可选)一个符号字符('+' 或 '-')
数字,字母,符号,空格组成的字符串表达式
- 若干空格
转换算法如下:
1.去掉无用的前导空格
2.第一个非空字符为+或者-号时,作为该整数的正负号,如果没有符号,默认为正数
3.判断整数的有效部分:
3.1 确定符号位之后,与之后面尽可能多的连续数字组合起来成为有效整数数字,如果没有有效的整数部分,那么直接返回0
3.2 将字符串前面的整数部分取出,后面可能会存在存在多余的字符(字母,符号,空格等),这些字符可以被忽略,它们对于函数不应该造成影响
3.3 整数超过 32 位有符号整数范围[−2^31, 2^31 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^31的整数应该被调整为 −2^31,大于 2^31 − 1 的整数应该被调整为 2^31 − 1
4.去掉无用的后导空格
数据范围:
0 <=字符串长度<= 100
字符串由英文字母(大写和小写)、数字(0-9)、' '、'+'、'-' 和 '.' 组成
示例 1:
输入:"82"
返回值:82
示例 2:
输入:" -12 "
返回值:-12
说明:去掉前后的空格,为-12
示例 3:
输入:"4396 clearlove"
返回值:4396
说明:6后面的字符不属于有效的整数部分,去除,但是返回前面提取的有效部分
示例 4:
输入:"clearlove 4396"
返回值:0
示例 5:
输入:"-987654321111"
返回值:-2147483648
解题代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
public int StrToInt (String s) {
// write code here
//判断是否无效
if (s == null)
return 0;
//切割首尾空格
s = s.trim();
if (s.equals(""))
return 0;
char first = s.charAt(0);
int res = 0;
//判断头部是否有效
if (!(first == '-' || first == '+' || (first >= '0' && first <= '9')))
return 0;
//记录数字开始的有效位置
int start = 0;
//用于判断是否超出32位有效整数
int minq = Integer.MIN_VALUE / 10;
int minr = Integer.MIN_VALUE % 10;
//判断结果正负
boolean pos = first == '-' ? false : true;
if (first == '-' || first == '+')
start++;
//一律用负数表示结果,最后再定正负
for (int i = start; i < s.length(); i++) {
char cur = s.charAt(i);
//若当前字符无效,立刻停止
if (cur < '0' || cur > '9')
break;
//计算当前字符表示的数字
int val = 0 - Integer.parseInt(Character.toString(cur));
//如果超出了最小负整数
if (res < minq || (res == minq && val < minr))
return pos ? Integer.MAX_VALUE : Integer.MIN_VALUE;
res = res * 10 + val;
}
//根据正负号,返回对应的值
return pos ? res == Integer.MIN_VALUE ? Integer.MAX_VALUE : -res : res;
}
}


评论区 0