주제 링크
제목 설명
당신이 기능을 구현하기 위해 atoi 함수, 그것은 문자열을 정수로 변환 할 수 있습니다.
(가) 지금까지 최초의 비 공백 문자를 찾을 때까지 첫째, 기능이 필요한 경우 쓸모없는 공백 문자 폐기와 함께 시작됩니다.
우리는 첫 번째 비 공백 문자는 정수의 부호로, 최대 나중에만큼 연속 번호 가능한 양 또는 음의 숫자, 기호의 조합을 찾을 때, 최초의 비 공백 문자 인 경우 연속 숫자가 정수를 형성하기 위해 결합 직후 인물.
또한 여분의 문자가 존재할 수있는 유효한 정수 부분 후 문자열뿐만 아니라, 이러한 문자는 무시 될 수있다, 그들은 기능에 영향을 미치지 않습니다.
참고 : 첫 번째 비 공백 문자의 문자열이 유효한 정수 문자열이 비어 있지 않거나 공백 만 문자열을 포함하는 경우, 당신은 변환 함수가 될 필요가 없습니다.
함수가 효율적으로 변환 할 수없는 경우 어떤 경우에는, 0이 반환됩니다.
설명 :
$ - [2 ^ {31} {31} ^ 2 --1 발명자 환경은 32 비트 정수 크기를 저장할 수 있다고 가정하고 그 값 범위는 $이다. 또는 INT_MIN ($ -2 ^ {31} $) - 값이이 범위를 초과하는 경우에는, 청은 INT_MAX ($ 1 $ 2 ^ {31}) 리턴한다.
예 1
输入: "42"
输出: 42
示例 2:
예 2
输入: " -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。
예 3
输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。
예 4
输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
因此无法执行有效的转换。
예 5
输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。
因此返回 INT_MIN (−231) 。
문제 해결
public int myAtoi(String str) {
str = str.trim(); // 删除字符串头尾空格
if (str.length() == 0) return 0;
int flag = 1; // 符号位标识
int rev = 0; // 数值(无符号)
int edge = Integer.MAX_VALUE / 10; // 判断数值是否超过范围的边界线,这样写可以节省时间
if (str.charAt(0) == '-') {
flag = -1;
str = str.substring(1, str.length()); // 跳过符号位,可不写第二参数
} else if (str.charAt(0) == '+') {
str = str.substring(1, str.length()); // 跳过符号位,可不写第二参数
} else if (!(str.charAt(0) >= '0' && str.charAt(0) <= '9')) { // 如果开始非空字符不为符号或数字,则直接返回 0
return 0;
}
for (char s : str.toCharArray()) {
if (s >= '0' && s <= '9') {
int n = s - '0'; // 计算字符代表值
if (rev >= edge) { // 超过边界情况较少,故该判断写于外侧
if (flag == 1) {
if (rev > edge || n > 7) return Integer.MAX_VALUE;
} else {
if (rev > edge || n > 8) return Integer.MIN_VALUE;
}
}
rev = rev * 10 + n;
} else {
break;
}
}
return rev * flag;
}
복잡도 분석
- 시간 복잡도 : $ O (n)이 $.
- 우주의 복잡성 : $의 O (n)이 $.
주의 사항
문제는 어렵지 않다, 범위를 확인합니다.