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

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

编写自己的Python程序 atoi()

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

句法:

int atoi(const char strn)

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

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

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

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

  • 将结果初始化为 0。
  • 从第一个字符开始,更新每个字符的结果。
  • 对于每个字符,将答案更新为result = result * 10 + (s[i] – '0')
Python
# Python program for implementation of atoi
  
# A simple atoi() function
  
  
def myAtoi(string):
    res = 0
  
    # Iterate through all characters of
    #  input string and update result
    for i in xrange(len(string)):
        res = res * 10 + (ord(string[i]) - ord('0'))
  
    return res
  
  
# Driver program
string = "89789"
  
# Function call
print myAtoi(string)
  
# This code is contributed by BHAVYA JAIN


Python
# Python program for implementation of atoi
  
# A simple atoi() function
  
  
def myAtoi(string):
    res = 0
    # initialize sign as positive
    sign = 1
    i = 0
  
    # if number is negative then update sign
    if string[0] == '-':
        sign = -1
        i += 1
  
    # Iterate through all characters 
    # of input string and update result
    for j in xrange(i, len(string)):
        res = res*10+(ord(string[j])-ord('0'))
  
    return sign * res
  
  
# Driver code
string = "-123"
  
# Function call
print myAtoi(string)
  
# This code is contributed by BHAVYA JAIN


Python3
# A simple Python3 program for
# implementation of atoi
import sys
  
def myAtoi(Str):
  
    sign, base, i = 1, 0, 0
      
    # If whitespaces then ignore.
    while (Str[i] == ' '):
        i += 1
      
    # Sign of number
    if (Str[i] == '-' or Str[i] == '+'):
        sign = 1 - 2 * (Str[i] == '-')
        i += 1
  
    # Checking for valid input
    while (i < len(Str) and 
          Str[i] >= '0' and Str[i] <= '9'):
                
        # Handling overflow test case
        if (base > (sys.maxsize // 10) or
           (base == (sys.maxsize // 10) and 
           (Str[i] - '0') > 7)):
            if (sign == 1):
                return sys.maxsize
            else:
                return -(sys.maxsize)
          
        base = 10 * base + (ord(Str[i]) - ord('0'))
        i += 1
      
    return base * sign
  
# Driver Code
Str = list(" -123")
  
# Functional Code
val = myAtoi(Str)
  
print(val)
  
# This code is contributed by divyeshrabadiya07


输出
89789

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

Python

# Python program for implementation of atoi
  
# A simple atoi() function
  
  
def myAtoi(string):
    res = 0
    # initialize sign as positive
    sign = 1
    i = 0
  
    # if number is negative then update sign
    if string[0] == '-':
        sign = -1
        i += 1
  
    # Iterate through all characters 
    # of input string and update result
    for j in xrange(i, len(string)):
        res = res*10+(ord(string[j])-ord('0'))
  
    return sign * res
  
  
# Driver code
string = "-123"
  
# Function call
print myAtoi(string)
  
# This code is contributed by BHAVYA JAIN
输出
-123

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

输出
-134

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

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

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

空跑:

下面是上述方法的实现:

Python3

# A simple Python3 program for
# implementation of atoi
import sys
  
def myAtoi(Str):
  
    sign, base, i = 1, 0, 0
      
    # If whitespaces then ignore.
    while (Str[i] == ' '):
        i += 1
      
    # Sign of number
    if (Str[i] == '-' or Str[i] == '+'):
        sign = 1 - 2 * (Str[i] == '-')
        i += 1
  
    # Checking for valid input
    while (i < len(Str) and 
          Str[i] >= '0' and Str[i] <= '9'):
                
        # Handling overflow test case
        if (base > (sys.maxsize // 10) or
           (base == (sys.maxsize // 10) and 
           (Str[i] - '0') > 7)):
            if (sign == 1):
                return sys.maxsize
            else:
                return -(sys.maxsize)
          
        base = 10 * base + (ord(Str[i]) - ord('0'))
        i += 1
      
    return base * sign
  
# Driver Code
Str = list(" -123")
  
# Functional Code
val = myAtoi(Str)
  
print(val)
  
# This code is contributed by divyeshrabadiya07
输出
-123

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

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

atoi() 的递归程序。

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

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