【剑指offer】49、把字符串转换成整数

本文介绍了一个不使用库函数实现字符串到整数转换的StrToInt函数,详细解析了处理正负号、边界值及溢出问题的代码实现,并通过测试用例验证其正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目要求

请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他类似的库函数。

解题思路

本题考查的是将字符串转换为int类型的数字。思路很简单,但是就是要考虑一些特殊情况。

字符串为null,空串,有除了数字之外的字符,溢出(整数的范围是-2147483648~2147483647).

还有数字的正负问题,也需要考虑到其中。

测试用例

1.功能测试(正、负、零、带有正负号的数字)

2.边界值测试(最大正整数,最小负整数)

3.特殊测试(null,数空字符串,仅有正负号,非法字符)

代码

package mySword;

//将"123"--->123
//将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),
//要求不能使用字符串转换整数的库函数。
//数值为0或者字符串不是一个合法的数值则返回0。

public class StrToInt2 {
    public static int StrToInt(String str){
        boolean minus = false;//如果为负号,则改为true
        int index = 0;
        int len = str.length();

        //判断str是否为null,如果为空则返回-1
        if(str == null){
            return -1;
        }
        //判断str的长度是否为0,如果为空则返回-1
        if(str.length() == 0){
            return -1;
        }
        //判断是整数还是负数
        if(str.charAt(0) == '+'){
            index ++;
        }else if(str.charAt(0) == '-'){
            index ++;
            minus = true;
        }
        //还有一种情况就是这个字符串只有一个符号,也是不对的
        if(index != 0 && len == 1){
            return  -1;
        }

        int res = 0;

        for(int i = index; i < len; i++){
            if(str.charAt(i) >= '0' && str.charAt(i) <= '9'){
                res = res * 10;
                res += str.charAt(i) - '0';
                //溢出的情况:原来是正数,加着加着变成负数;原来是负数,加着加着变成正数
                if ((!minus && (res < 0)) && (minus && (res-1) > 0)){
                    res = 0;
                    break;
                }
            }else{
                res = 0;
                break;
            }
        }
        return res;
    }

    public static void main(String[] args) {
        String str = "abc";
        System.out.println("abc:" + StrToInt(str));
        String str1 = "123";
        System.out.println("123:" + StrToInt(str1));
        int num = Integer.parseInt("2333");
        System.out.println(num);
    }
}

收获

0、charAt(int index)方法是一个能够用来检索特定索引下的字符的String实例的方法。

      charAt()方法返回指定索引位置的char值。索引范围为0~length()-1。

1、注意各种异常值,边界值

2、记住int类型的范围是-2147483648~2147483647,要考虑溢出的问题

3、参考了https://www.cnblogs.com/yongh/p/9688259.html文中关于int类型和char类型的转化。

package mySword;

public class intAndChar {
    //int转char
    //int类型转char类型,将数字加一个‘0’,并强制类型转换为char即可
    public static void int2Char(int num){
        char c = (char)(num + '0');
        System.out.println("数字" + num + "转换成char之后是:" + c);
    }

    //char转int
    //char类型装int类型,将字符减一个‘0’即可
    public static void char2Int(char c){
        int num = c - '0';
        System.out.println("字符串" + c + "转换之后是:" + num);
    }

    public static void main(String[] args) {
        int2Char(9);
        char2Int('3');

        //int类型转char类型
        int number = 9;
        char cNumber= (char) (number+'0');
        System.out.println("Number "+number+" to char is:"+cNumber);

        //char类型转int类型
        char cNumber2='3';
        int number2=cNumber2-'0';
        System.out.println("Char "+cNumber2+" to number is:"+number2);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值