每日算法之实现字符串转换整数(atoi)

191 阅读3分钟

原题链接在此

关注我前端宝剑

一步一步教你如何用JavaScript实现字符串转换整数(atoi)的功能。

  1. 理解问题

首先,我们要明确问题的要求。atoi是一个广泛使用的函数,它的作用是将一个字符串转换为对应的整数值。比如字符串"42"应该被转换为整数42,字符串"-117"应该被转换为整数-117。

需要注意的是,这个函数只会转换字符串开头的连续数字部分,如果遇到非数字字符就会停止转换。比如字符串"3.14abc"应该转换为整数3。空字符串应该转换为0。

  1. 基本转换

我们先从最简单的情况开始。如果字符串只包含一个数字字符,我们可以使用字符的Unicode码值与"0"的码值相减来获得对应的数值:

function atoi(str) {
  if (str.length === 0return 0// 空字符串返回0
  const code = str.charCodeAt(0); // 获取第一个字符的Unicode码值
  if (code < 48 || code > 57return 0// 如果不是数字字符,返回0
  return code - 48// 将码值转换为对应的数字
}
  1. 支持多位数字

现在我们来处理包含多个数字字符的情况。我们可以遍历字符串,对每个数字字符进行转换,然后将结果累加起来:

function atoi(str) {
  let result = 0;
  for (let i = 0; i < str.length; i++) {
    const code = str.charCodeAt(i);
    if (code < 48 || code > 57) break; // 如果遇到非数字字符,停止转换
    result = result * 10 + (code - 48); // 将当前数字叠加到结果上
  }
  return result;
}
  1. 处理正负号

上面的代码还没有处理正负号的情况。我们需要先检查字符串的第一个字符是否为"+"或"-",然后对结果乘以正负号:

function atoi(str) {
  let sign = 1; // 默认为正数
  let i = 0;
  if (str[0] === '-') {
    sign = -1;
    i = 1;
  } else if (str[0] === '+') {
    i = 1;
  }
  let result = 0;
  for (; i < str.length; i++) {
    const code = str.charCodeAt(i);
    if (code < 48 || code > 57) break;
    result = result * 10 + (code - 48);
  }
  return sign * result;
}
  1. 处理前导空格

最后,我们需要处理字符串前面的空格。我们可以从字符串起始位置跳过所有的空格字符:

function atoi(str) {
  let sign = 1;
  let i = 0;
  // 跳过前导空格
  while (str[i] === ' ') i++;
  if (str[i] === '-') {
    sign = -1;
    i++;
  } else if (str[i] === '+') {
    i++;
  }
  let result = 0;
  for (; i < str.length; i++) {
    const code = str.charCodeAt(i);
    if (code < 48 || code > 57) break;
    result = result * 10 + (code - 48);
  }
  return sign * result;
}
  1. 处理数据溢出

最后,我们需要处理数据在最大值和最小值的区间范围内:

function myAtoi(str) {
    const INT_MAX = 2 ** 31 - 1;
    const INT_MIN = -(2 ** 31);
    
    let sign = 1;
    let i = 0;
    let result = 0;
    
    // 跳过前导空格
    while (str[i] === ' ') i++;
    
    // 检查符号
    if (str[i] === '-' || str[i] === '+') {
        sign = str[i] === '-' ? -1 : 1;
        i++;
    }
    
    // 计算数值
    while (i < str.length) {
        const code = str.charCodeAt(i) - 48; // 获取当前字符对应的数字
        if (code < 0 || code > 9) break; // 如果不是数字,跳出循环
        
        // 检查是否溢出
        if (result > Math.floor(INT_MAX / 10) || (result === Math.floor(INT_MAX / 10) && code > INT_MAX % 10)) {
            return sign === 1 ? INT_MAX : INT_MIN;
        }
        
        result = result * 10 + code;
        i++;
    }
    
    return sign * result;
}

这就是用JavaScript实现字符串转整数(atoi)函数的完整过程。我们从最基础的单个数字字符转换开始,逐步添加支持多位数字、正负号和前导空格的功能。通过这样由浅入深的讲解,你应该能够掌握这个问题的解决思路和代码实现了。如果还有任何疑问,欢迎继续提出。