Java에서 int (atoi)에 문자열 구현

이 함수는 먼저 필요한만큼 공백 문자를 버립니다. 공백이 아닌 첫 번째 문자가 발견되었습니다. 그런 다음이 문자에서 시작하여 선택적 초기 플러스 또는 마이너스 기호와 가능한 많은 숫자 숫자를 취하여 숫자 값으로 해석합니다.

문자열은 다음을 구성하는 문자 뒤에 추가 문자를 포함 할 수 있습니다. 정수는 무시되며이 함수의 동작에 영향을주지 않습니다.

str에서 공백이 아닌 문자의 첫 번째 시퀀스가 유효한 정수가 아닌 경우 또는 이러한 시퀀스가 존재하지 않는 경우 str이 비어 있거나 공백 문자 만 포함 된 경우 변환이 수행되지 않습니다.

유효한 변환을 수행 할 수없는 경우 0 값이 반환됩니다. 올바른 값이 표현 가능한 값의 범위를 벗어나면 INT_MAX (2147483647) 또는 INT_MIN (-2147483648)이 반환됩니다.

잘 모르겠습니다. 정수 오버플로에 대한 내 검사에 대한 내용이지만 구현은 다음과 같습니다.

public int myAtoi(String str) { int i = 0; while (i < str.length() && Character.isWhitespace(str.charAt(i))) { ++i; } if (i == str.length()) { return 0; } boolean isNegative = false; if (str.charAt(i) == "+" || str.charAt(i) == "-") { isNegative = str.charAt(i) == "-"; ++i; } int result = 0; while (i < str.length() && Character.isDigit(str.charAt(i))) { try { result = Math.multiplyExact(result, 10); result = Math.addExact(result, Character.getNumericValue(str.charAt(i))); } catch (ArithmeticException e) { return isNegative ? Integer.MIN_VALUE : Integer.MAX_VALUE; } ++i; } if (isNegative) { result = -result; } return result; } 

Answer

대체로 말하면 “다양한 주요 세부 정보에서 꽤 잘 구현 된 것입니다.

Character.isDigit()Character.getNumericValue() 메소드는보기에 좋습니다.

오버플로 조건을 처리하는 Math.* 메소드도 좋습니다.

잘 모르겠습니다. 의도 한 경우, 32 비트 부호있는 정수 시스템 (Java뿐만 아니라)에서 모호한 에지 케이스도 올바르게 처리합니다. 여기서 Integer.MIN_VALUE- Integer.MAX_VALUE … 그리고 당신의 코드는 “-2147483648″텍스트의 정확한 입력에 대해 정확하게 맞습니다.

그래서, 당신은 당신의 코드에 좋은 세부 사항을 가지고 있습니다 …. 그리고 깨진 가장자리 케이스를 볼 수 없습니다.

내 유일한 권장 사항은 상태 머신이 하나의 루프로 일을 더 간단하게 만들 수 있다는 것입니다 …..하지만 상태 머신도 약간 지저분 할 수 있습니다. 장기적으로 …

public static int rlAtoi(String str) { boolean started = false; boolean negative = false; int result = 0; try { for (char c : str.toCharArray()) { if (!started && Character.isWhitespace(c)) { // great, ignore it. } else if (!started && (c == "+" || c == "-")) { // great, a sign negative = c == "-"; started = true; } else if (Character.isDigit(c)) { result = Math.multiplyExact(result, 10); result = Math.addExact(result, Character.getNumericValue(c)); started = true; } else { // done.... break; } } } catch (ArithmeticException e) { return negative ? Integer.MIN_VALUE : Integer.MAX_VALUE; } return negative ? -result : result; } 

원시 성능 벤치 마크에서 솔루션이 (약간) 더 빠를 것이라고 생각하지만 작은 것보다 가독성을 선호합니다. 성능이 극도로 중요하지 않는 한 점진적인 성능 향상.

설명

  • 상태 시스템의 경우 +1, 이는 훨씬 쉽고 거의 항상 빠르고 훨씬 디버그 / 확장이 더 쉽습니다.

답변

“-“문자에 대한 중복 테스트가 있습니다. 다시 작성

boolean isNegative = false; if (str.charAt(i) == "+" || str.charAt(i) == "-") { isNegative = str.charAt(i) == "-"; ++i; } 

as

boolean isNegative = false; if (str.charAt(i) == "-") { isNegative= true; ++i; } else if (str.charAt(i) == "+") ++i; 

16 진수 지원도 추가하겠습니다.

댓글

  • switch 블록도 여기서 잘 작동합니다.
  • 아, 그건 ' 사실입니다. 폴스 루가있는 switch는 아마도 중복이 가장 적을 것입니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다