package com.thealgorithms.strings;
/**
* A utility class that provides a method to convert a string to a 32-bit signed integer (similar to C/C++'s atoi function).
*/
public final class MyAtoi {
private MyAtoi() {
}
/**
* Converts the given string to a 32-bit signed integer.
* The conversion discards any leading whitespace characters until the first non-whitespace character is found.
* Then, it takes an optional initial plus or minus sign followed by as many numerical digits as possible and interprets them as a numerical value.
* The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.
*
* If the number is out of the range of a 32-bit signed integer:
* - Returns {@code Integer.MAX_VALUE} if the value exceeds {@code Integer.MAX_VALUE}.
* - Returns {@code Integer.MIN_VALUE} if the value is less than {@code Integer.MIN_VALUE}.
*
* If no valid conversion could be performed, a zero is returned.
*
* @param s the string to convert
* @return the converted integer, or 0 if the string cannot be converted to a valid integer
*/
public static int myAtoi(String s) {
if (s == null || s.isEmpty()) {
return 0;
}
s = s.trim();
int length = s.length();
if (length == 0) {
return 0;
}
int index = 0;
boolean negative = false;
// Check for the sign
if (s.charAt(index) == '-' || s.charAt(index) == '+') {
negative = s.charAt(index) == '-';
index++;
}
int number = 0;
while (index < length) {
char ch = s.charAt(index);
if (!Character.isDigit(ch)) {
break;
}
int digit = ch - '0';
// Check for overflow
if (number > (Integer.MAX_VALUE - digit) / 10) {
return negative ? Integer.MIN_VALUE : Integer.MAX_VALUE;
}
number = number * 10 + digit;
index++;
}
return negative ? -number : number;
}
}