首页 > 试题广场 >

把字符串转换成整数

[编程题]把字符串转换成整数
  • 热度指数:507858 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0

数据范围:字符串长度满足
进阶:空间复杂度 ,时间复杂度

注意:
①字符串中可能出现任意符号,出现除 +/- 以外符号时直接输出 0
②字符串中可能出现 +/- 且仅可能出现在字符串首位。

输入描述:
输入一个字符串,包括数字字母符号,可以为空


输出描述:
如果是合法的数值表达则返回该数字,否则返回0
示例1

输入

"+2147483647"

输出

2147483647
示例2

输入

"1a33"

输出

0
写一个JavaScript的解,使用正则
function StrToInt(str)
{
    // write code here
    let num = str.trim().match(/^[+-]?\d+$/)
    if(!num || num == '-0') return 0
    let Max = 2 ** 31 - 1
    let Min = -(2 ** 31)
    return num >= Max ? Max : num <= Min ? Min : num
}
module.exports = {
    StrToInt : StrToInt
};


发表于 2021-08-05 08:11:52 回复(0)
  let num = str.split();            //分割成数字数组
  if (num) {
    let test = /^[+-]?\d+$/.test(num[0]);       //正则判断
    return test?(num[0]!=0?num[0]:0):0            //(num[0]!=0?num[0]:0),这个主要是为了判断"-0"的情况  
  } else {
    return 0;
  }
考虑各种情况......全靠测
发表于 2021-06-16 15:55:39 回复(0)
function StrToInt(str)
{
    // write code here
    //1、直接使用JavaScript的转换函数
//     if(str == '-2147483649' || str == '2147483648') return 0;
//     return Number(str) ? parseInt(str) : 0;
    
    
    //2、循环判断
    var sum = 0;

    if(str[0] == '+' || str[0] == '-'){
        if(str.length == 1){
            return 0
        }
        for(var j = 1;j<str.length;j++){
            if(str.charCodeAt(j) >48 && str.charCodeAt(j) <= 57){
                sum = sum * 10 + (str.charAt(j) - 0);
            }else{
                return 0;
            }
        }
        if(str[0] == '-'){
            sum = sum * (-1);
        }
    }else{
        for(var k = 0;k<str.length;k++){
            if(str.charCodeAt(k) >=48 && str.charCodeAt(k) <= 57){
                sum = sum * 10 +(str.charAt(k) - 0);
            }else{
                return 0;
            }
        }
    }
    
    return sum;
}

发表于 2021-03-19 12:18:55 回复(0)
JavaScript 正则
function StrToInt(str)
{
    let arr = /^[\+]?(\-[1-9]\d*|\d+)$/.exec(str);
    return arr ? arr[1] : 0;
}


发表于 2020-07-08 01:15:00 回复(0)
/**
 * 我的解题思路:
 * 1.首先对传入字符串的符号进行处理,判断首位是否传入了符号,如果带有符号就先去掉符号,便于后续处理
 * 2.接着判断一下剩余的字符串是否数字,这里采用一种简单的判断方法,即使用正则test,因为test的参数就是字符串
 * 3.而如何将字符串数字转换成真正的数字,这里使用数字转字符串再判断的方式来获取每一位的数字
 * 4.然后根据字符串数字的位置来对数字进行乘10运算,并将每一位的结果相加即可
 * 5.最后就是根据前面获取的符合来返回整数或者负数即可
 * 
 * @param {*} str 
 */
function StrToInt(str)
{
    // write code here
    let symbol = true;
    if (str[0] === '-') {
        symbol = false;
        str = str.slice(1);
    }
    if (str[0] === '+') {
        str = str.slice(1);
    }
    if (!/^[1-9]\d*$/.test(str) || str === '0') {
        return 0;
    }

    let result = 0;
    const numbers = [...Array(10).keys()];
    for (let i = str.length - 1; i >= 0; i--) {
        let n = numbers.find(item => item.toString() === str[i]);
        let tenNum = str.length - 1 - i;
        while (tenNum--) {
            n *= 10;
        }
        result += n;
    }
    return symbol ? result : -result;
}

/**
 * 评论区TOP的解题思路:
 * 1.在评论区并没有看到很好的解题思路
 * 2.由于JS语言的特性,不能对字符串进行加减操作,不然会在内部之间进行转换
 * 
 * @param {*} str 
 */
function topStrToInt(str)
{
    // write code here
}

发表于 2020-07-02 21:38:23 回复(0)

思路

首先需要注意排除空字符串,然后注意标记符号,接下来就是遍历,一个一个的去判断,最后再判断是否超出边界。
##代码

function StrToInt(str)
{
    // write code here
    let len=str.length;
    let flag=1,res=0;
    if(!str) return 0;//如果为空,返回0
    if(str[0]=='-') flag=-1;

    for(let i = (str[0] ==  '-' || str[0] == '+') ? 1 : 0; i < len; ++i){//如果第一位是正负号,则从第二位开始
        if(str[i]<'0'||str[i]>'9') return 0;

        res=res*10+(str[i]-'0');
    }

    return res * flag < -2147483648 || res * flag > 2147483647 ? 0 : res * flag // 判断超出大于限定范围
}
发表于 2020-03-02 11:19:57 回复(0)
function StrToInt(str)
{
    // write code here
    if(str == ''){
        return 0;
    }
    let numlist = ['0','1','2','3','4','5','6','7','8','9'];
    let sum = 0,label = 1;
    if(str[0] == '+'){
        label = 1;
        for(let i = 1, len = str.length; i < len; i++){
            if(numlist.indexOf(str[i]) == '-1'){
                return 0;
            }else{
                sum = sum*10 + numlist.indexOf(str[i]);
            }
        }
    }else if(str[0] == '-'){
        label = -1;
        for(let i = 1, len = str.length; i < len; i++){
            if(numlist.indexOf(str[i]) == '-1'){
                return 0;
            }else{
                sum = sum*10 + numlist.indexOf(str[i]);
            }
        }
    }else{
        for(let i = 0, len = str.length; i < len; i++){
            if(numlist.indexOf(str[i]) == '-1'){
                return 0;
            }else{
                sum = sum*10 + numlist.indexOf(str[i]);
            }
        }
    }
    let res = sum*label;
    if(res >= -0x80000000 && res <= 0x7FFFFFFF){
        return res;
    }else{
        return 0;
    }
}

发表于 2020-02-07 20:32:52 回复(0)
//JS解法
function StrToInt(str)
{
    // write code here
    if(str==""){
        return 0;
    }
    str=str.split("");    //将字符串转为数组
    var len=str.length;   //记录数组的长度 
    var res="";           //记录最终结果
    var i;                //记录仪首位从哪里开始
    if((str[0]=="+"||str[0]=="-")&&str[1]){    //判断首位是否为正号或者负号
        i=1;
    }else if(!str[1]){     //首位是符号且后面无数字,返回0
        return 0;
    }else{
        i=0;
    }
    for(i;i<len;i++){
        if(str[i]>=0&&str[i]<=9){
            res+=str[i];
        }else{  //如果遇到不是数字的字符,则直接返回0
            return 0;
        }
    }
    if(str[0]=="-"){      //首位为负号则返回负数
        res="-"+res;
    }
    if(res>=2147483648||res<=-2147483649) return 0  //判断边界
    return res;
     
}
module.exports = {
    StrToInt : StrToInt
};

发表于 2019-12-15 13:48:36 回复(0)
JavaScript解法:
js作为一门弱语言,+字符串就可以将字符串转换成数字
function StrToInt(str){
    if(/^[+-]?(0|([1-9]\d*))$/.test(str)){
        var reStr = +str;
        return reStr;
    }else{
        return 0;
    }
}


发表于 2019-08-29 11:42:55 回复(0)
极简代码
function StrToInt(str)
{
    // write code here
    if (!str) return 0;
    const arr = str.split('');
    const isSymbol = ['-', '+'].includes(arr[0]) ? 1 : 0;
    const negative = arr[0] === '-';
    let sum = 0;
    for (let i = isSymbol; i < arr.length; i++) {
        if (arr[i] > '9' || arr[i] < '0') return 0;
        sum = (arr[i] - '0') * (10**(arr.length - 1 - i)) + sum;
    }
    return negative ? -sum : sum;
}


编辑于 2019-08-28 20:17:02 回复(0)
function StrToInt(str)
{
    var reg = [0,1,2,3,4,5,6,7,8,9];
    var l = [];
    var sum = 0;
    for(var i = 0;i < str.length;i++){
        for(var j = 0;j < reg.length;j++){
            if(str[i]==reg[j]){
                //十进制规则,当前位乘以对应权重
                sum += reg[j]*Math.pow(10,(str.length-1-i));
                l.push(i);
            }
        }
    }
    //处理‘+’,‘-’
    if(str[0]=='-'){
        return -sum;
    }else if(str[0]=='+'){
        return sum;
    }
    //如果转换结果长度不等于原来的长度,说明有的字符没有被转换,也就是存在非数字
    if(l.length!==str.length){
        return 0;
    }
    return sum;
}  
javascript比较暴力的方法,遍历字符串并找出对应位,用对应位乘以10的幂,最后返回和
可能没有考虑到溢出的情况
发表于 2019-08-18 10:29:57 回复(0)
function StrToInt(str)
{
    if(/^[+|-]*\d*$/.test(str) == false){
        return 0
    }
    return parseInt(str) || 0
}
module.exports = {
    StrToInt : StrToInt
};
javascript的处理用最少的代码处理最野的问题
发表于 2019-05-24 15:53:22 回复(0)
// 循环字符串:当前值*10相加,循环时看每一项是否合法,最后根据首位符号判断正负
// 需要判断以下异常情况
// 1.输入为空
// 2.有无符号 正负

    function StrToInt(str) {
      if (str == undefined || str == '') {
        return 0;
      }
      const first = str[0];
      let i = 1;
      let int = 0;
      if (first >= 0 && first <= 9) {
        int = first;
      } else if (first !== '-' && first !== '+') {
        return 0;
      }
      while (i < str.length) {
        if (str[i] >= 0 && str[i] <= 9) {
          int = int * 10 + (str[i] - 0);
          i++;
        } else {
          return 0;
        }
      }
      return first === '-' ? 0 - int : int;
    }

发表于 2019-03-18 17:52:44 回复(0)

Javascript 最短代码

StrToInt=_=>~~+_

发表于 2018-10-05 22:51:32 回复(1)
常规思路,多重判断条件,比较麻烦。稍不留神就漏掉某一条件。
function StrToInt(str)
{
    if (!str) {   // 判断是否为空
        return 0;
    }
    var p = /[0-9]/g;
    if (str.length == 1) {    // 若只有一个字符,容易判断是否数字
        if (p.test(str)) {
            return str - 0;
        } else {
            return 0;
        }
    }
    var flag = '+';     // 默认符号为正
    if (!p.test(str[0])) {     // 若首字符不为数字,判断是否+/-号
        var p2 = /[\+\-]/;
        if (p2.test(str[0])) {
            flag = str[0];
            str = str.substr(1);      // 将符号单独抽出来
        } else {
            return 0;
        }
    }
    var p3 = /[a-zA-Z~'!@#¥$%^&*()-+_=:]/g;
    if (p3.test(str)) {      // 判断是否包含特殊字符
        return 0;
    }
    var p4 = /\./g;
    var tmp = str.match(p4);         // 判断是否包含小数点
    if (tmp) {
        if (tmp.length > 1) {          // 若小数点不止一个,同包含特殊符号一个道理
            return 0;
        }
        if (tmp.length == 1) {       // 若包含一个小数点,去掉小数点及点后的数字
            let idx = str.indexOf('.');
            str = str.substr(0, idx);
        }
    }
    if (flag == '-') {        // 判断是否为负数
        return 0 - str;
    } else {
        return str - 0;
    }
}
发表于 2018-07-25 15:19:47 回复(0)
function StrToInt(str)
{
    // write code here
    
    var number=Number(str);
    
    if(number===number){
        return number;
    }else{
        return 0;
    }
       
}

发表于 2018-07-02 09:41:14 回复(0)
function StrToInt(str) {
   var num = +str
   if (num !== num) {
       return 0
   }
   return num
}
发表于 2018-06-19 13:24:46 回复(0)
感觉自己写的很复杂,如果有更好的答案,麻烦告诉我,谢谢
function StrToInt(str)
{
    if(str === "0" || str === "-0" || str === "+0") return 0;

    var num = 0, sign = 1;
    var reg = new RegExp("^(\\+|-|[0-9])?[0-9]+$");
    var regNum = new RegExp("^[0-9]+$");
    var regTrim = new RegExp("")
    
    if(str.length !== 0 && reg.test(str)) {
        if(!regNum.test(str)) {
            if(str[0] === "-") { // 符号位
                sign = -1; 
            }
            if(str[0] === '-') {
                str = str.replace(/-/, ''); //去除-
            }
            if(str[0] === '+') {
                str = str.replace(/\+/,''); //去除+
            }
            if(str[0] === '0') {
                str = str.replace(/^0+/, ''); // 去除起始0
            }
            str.replace(/^0+/, ''); // 去除起始0
        }
        num = numSum(str);
    }
    return sign*num;
}

function numSum(str) {
    var nums = [], numStr = 0;
    for(var i = 0; i < str.length; i++) {
        nums.push(ChToNum(str[i]));
    }
    for(var m = 0; m < nums.length; m++) {
        numStr += nums[m]*Math.pow(10, nums.length - m -1);
    }
    return numStr;
}

function ChToNum(ch) {
    var num = 0;
    switch(ch) {
        case "0": num = 0;break;
        case "1": num = 1;break;
        case "2": num = 2;break;
        case "3": num = 3;break;
        case "4": num = 4;break;
        case "5": num = 5;break;
        case "6": num = 6;break;
        case "7": num = 7;break;
        case "8": num = 8;break;
       default  : num = 9;break;
    }
    return num;
}

发表于 2018-02-28 12:23:10 回复(0)