자바 알고리즘 연습 - 문자열 변환 정수 (atoi 함수)

주제 링크

제목 설명

당신이 기능을 구현하기 위해 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)이 $.

주의 사항

문제는 어렵지 않다, 범위를 확인합니다.

추천

출처www.cnblogs.com/mxwbq/p/10945650.html