📜  Java程序编写自己的 atoi()

📅  最后修改于: 2022-05-13 01:57:08.436000             🧑  作者: Mango

Java程序编写自己的 atoi()

C 中的atoi()函数将字符串(表示整数)作为参数并返回其 int 类型的值。所以基本上该函数用于将字符串参数转换为整数。

句法:

int atoi(const char strn)

参数:该函数接受一个参数strn ,该参数指的是需要转换为其等效整数的字符串参数。

返回值:如果 strn 是有效输入,则该函数返回与传递的字符串数字等效的整数。如果没有发生有效的转换,则函数返回零。

现在让我们了解可以创建自己的 atoi()函数的各种方法,这些方法支持各种条件:

方法一:下面是一个简单的转换实现,不考虑任何特殊情况。

  • 将结果初始化为 0。
  • 从第一个字符开始,更新每个字符的结果。
  • 对于每个字符,将答案更新为result = result * 10 + (s[i] – '0')
Java
// A simple Java program for
// implementation of atoi
class GFG {
  
    // A simple atoi() function
    static int myAtoi(String str)
    {
        // Initialize result
        int res = 0;
  
        // Iterate through all characters
        // of input string and update result
        // take ASCII character of corresponding digit and
        // subtract the code from '0' to get numerical
        // value and multiply res by 10 to shuffle
        // digits left to update running total
        for (int i = 0; i < str.length(); ++i)
            res = res * 10 + str.charAt(i) - '0';
  
        // return result.
        return res;
    }
  
    // Driver code
    public static void main(String[] args)
    {
        String str = "89789";
        
          
        // Function call
        int val = myAtoi(str);
        System.out.println(val);
    }
}
  
// This code is contributed by PrinciRaj1992


Java
// Java program for
// implementation of atoi
class GFG {
  
    // A simple atoi() function
    static int myAtoi(char[] str)
    {
  
        // Initialize result
        int res = 0;
  
        // Initialize sign as positive
        int sign = 1;
  
        // Initialize index of first digit
        int i = 0;
  
        // If number is negative, then
        // update sign
        if (str[0] == '-') {
            sign = -1;
  
            // Also update index of first
            // digit
            i++;
        }
  
        // Iterate through all digits
        // and update the result
        for (; i < str.length; ++i)
            res = res * 10 + str[i] - '0';
  
        // Return result with sign
        return sign * res;
    }
  
    // Driver code
    public static void main(String[] args)
    {
        char[] str = "-123".toCharArray();
        
        // Function call
        int val = myAtoi(str);
        System.out.println(val);
    }
}
  
// This code is contributed by 29AjayKumar


Java
// A simple Java program for
// implementation of atoi
class GFG {
    static int myAtoi(char[] str)
    {
        int sign = 1, base = 0, i = 0;
  
        // if whitespaces then ignore.
        while (str[i] == ' ')
        {
            i++;
        }
  
        // sign of number
        if (str[i] == '-' || str[i] == '+')
        {
            sign = 1 - 2 * (str[i++] == '-' ? 1 : 0);
        }
  
        // checking for valid input
        while (i < str.length 
               && str[i] >= '0'
               && str[i] <= '9') {
  
            // handling overflow test case
            if (base > Integer.MAX_VALUE / 10
                || (base == Integer.MAX_VALUE / 10
                    && str[i] - '0' > 7)) 
            {
                if (sign == 1)
                    return Integer.MAX_VALUE;
                else
                    return Integer.MIN_VALUE;
            }
            base = 10 * base + (str[i++] - '0');
        }
        return base * sign;
    }
  
    // Driver code
    public static void main(String[] args)
    {
        char str[] = " -123".toCharArray();
        
        // Function call
        int val = myAtoi(str);
        System.out.printf("%d ", val);
    }
}
  
// This code is contributed by 29AjayKumar


输出
89789

方法 2:此实现处理负数。如果第一个字符是“-”,则将符号存储为负数,然后使用前面的方法将字符串的其余部分转换为数字,同时将符号与它相乘。

Java

// Java program for
// implementation of atoi
class GFG {
  
    // A simple atoi() function
    static int myAtoi(char[] str)
    {
  
        // Initialize result
        int res = 0;
  
        // Initialize sign as positive
        int sign = 1;
  
        // Initialize index of first digit
        int i = 0;
  
        // If number is negative, then
        // update sign
        if (str[0] == '-') {
            sign = -1;
  
            // Also update index of first
            // digit
            i++;
        }
  
        // Iterate through all digits
        // and update the result
        for (; i < str.length; ++i)
            res = res * 10 + str[i] - '0';
  
        // Return result with sign
        return sign * res;
    }
  
    // Driver code
    public static void main(String[] args)
    {
        char[] str = "-123".toCharArray();
        
        // Function call
        int val = myAtoi(str);
        System.out.println(val);
    }
}
  
// This code is contributed by 29AjayKumar
输出
-123

方法 3:此实现处理各种类型的错误。如果str为 NULL 或str包含非数字字符,则返回 0,因为该数字无效。

输出
-134

方法4:需要处理四种极端情况:

  • 丢弃所有前导空格
  • 号码的标志
  • 溢出
  • 输入无效

要删除前导空格,请运行循环,直到到达数字的字符。如果数字大于或等于 INT_MAX/10。如果符号为正则返回 INT_MAX,如果符号为负则返回 INT_MIN。其他情况在以前的方法中处理。

空跑:

下面是上述方法的实现:

Java

// A simple Java program for
// implementation of atoi
class GFG {
    static int myAtoi(char[] str)
    {
        int sign = 1, base = 0, i = 0;
  
        // if whitespaces then ignore.
        while (str[i] == ' ')
        {
            i++;
        }
  
        // sign of number
        if (str[i] == '-' || str[i] == '+')
        {
            sign = 1 - 2 * (str[i++] == '-' ? 1 : 0);
        }
  
        // checking for valid input
        while (i < str.length 
               && str[i] >= '0'
               && str[i] <= '9') {
  
            // handling overflow test case
            if (base > Integer.MAX_VALUE / 10
                || (base == Integer.MAX_VALUE / 10
                    && str[i] - '0' > 7)) 
            {
                if (sign == 1)
                    return Integer.MAX_VALUE;
                else
                    return Integer.MIN_VALUE;
            }
            base = 10 * base + (str[i++] - '0');
        }
        return base * sign;
    }
  
    // Driver code
    public static void main(String[] args)
    {
        char str[] = " -123".toCharArray();
        
        // Function call
        int val = myAtoi(str);
        System.out.printf("%d ", val);
    }
}
  
// This code is contributed by 29AjayKumar
输出
-123

上述所有方法的复杂性分析:

  • 时间复杂度: O(n)。
    只需要遍历一次字符串。
  • 空间复杂度: O(1)。
    因为不需要额外的空间。

atoi() 的递归程序。

锻炼:
编写你赢取的 atof() ,它将一个字符串(代表一个浮点值)作为参数,并将其值作为双精度值返回。

有关详细信息,请参阅关于编写自己的 atoi() 的完整文章!