剑指offer之把字符串转换成整数

题目

思路及代码

1、

1、不考虑正负号及特殊情况时:

采用for循环从左到右依次乘10累加,并将结果依次乘10累加(不能根据字符串长度进行按位求幂累加,因为字符串长度可能会超过int类型的最大位数,求得过程本身就已越界)

2、当字符串首位字符为'-'时,相减;为'+'或者首字母为数字时直接累加;

3、当字符串首字符为除2中情况的其他字符时,则不为数字,返回0;

判断依据:ASCII码中48~57为0到9十个阿拉伯数字。所以,当字符1要转换成数字1时,需要将字符1转换成ASCII码翻译出的数字再减去48(字符'0'),才是我们要的解。注意,这里可以判断其他字符,如果换算之后的数字不在0到9,就说明是其他字符,则直接返回0。

2、特殊情况

2.1 字符串为null和字符串长度为0(注意二者意义不一样,为空代表没有任何属性,也就不具备length属性) 返回0;

2.2 数组越界  必须在累加的过程中进行是否越界的判断,否则就是拿错误的结果进行是否越界的判断,结果本身就是错的。

int long 都是表示整型数字
int 的存储长度是2的32次方 取值范围是“-2^32”到“2^32-1”
Long的存储的长度是2的64次方 范围是 ”-2^64“ 到”2^64 -1“

import java.lang.Integer;
public class Solution {
    public int StrToInt(String str) {
       //不考虑任何情况的核心求解部分
        //for循环解决
        //特殊情况  字符串为null和字符串长度为0
        if(str == null || str.length() ==0)return 0;
        boolean flag = true;
        //首字符是否为+-
        long n = 0;
        for(int i =0;i<str.length();i++){
            if(i==0 && str.charAt(0) == '-')
                flag =false;
            else
                if(i==0 && str.charAt(0)=='+')
                    continue;
            else{
                int temp = str.charAt(i) - '0';
                if(temp < 0|| temp >9) return 0;
                else{
                    n= flag? (n*10+temp):(n*10-temp);
                    //判断是否已越界
                    if(n > Integer.MAX_VALUE || n< Integer.MIN_VALUE)
                        return 0;
                }
            }
        }
        return (int)n;
    }
}

 

代码

import java.util.regex.Pattern;
import java.lang.Integer;
public class Solution {
    public int StrToInt(String str) {
        if(str == "") return 0;
        if(str.equals('0'))  return 0;
       String p= "[+-]?[1-9]+[0-9]*";
          double tem = 0;
        if(Pattern.matches(str,p)){
          
            if(str.charAt(0)=='-'){
                for(int i =1;i<str.length();i++){
                    tem = tem + Math.pow(10,str.length()-1-i)*(str.charAt(i)-48);
                }
                tem = - tem;
            }else{
                if(str.charAt(0) =='+'){
                    for(int i =1;i<str.length();i++)
                    tem = tem + Math.pow(10,str.length()-1-i)*(str.charAt(i)-48);
                }else{
                for(int i =0;i<str.length();i++){
                    tem = tem + Math.pow(10,str.length()-1-i)*(str.charAt(i)-48);
            }
    }
        //return tem;
}
        }
        if(tem > Integer.MAX_VALUE || tem < Integer.MIN_VALUE) return 0;
            return (int)tem;
    }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值