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

本文介绍了一个不使用标准库函数的手动实现字符串到整数转换的方法。文章详细阐述了如何处理各种边界情况,如空字符串、前导空白、符号位及非法字符等,并提供了多个测试案例。

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

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

回到顶部
思路
  题目很简单,主要就是实现对每个字符转化为数字,并进行累加即可。但是有很多特殊情况都需要考虑进去,例如null、空字符串、带有正负号、字符不是数字、溢出等等。

对于非法的特殊输入,返回值为0,还要用一个全局变量进行标记。

写代码时一定要考虑清楚各种测试用例。

package offer;

import org.junit.Test;

/**
 * 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),
 * 要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
 * @author kankan
 * @creater 2019-07-24 20:16
 */
public class Solution67 {

    public  int StrToInt(String str) {
        //判断输入是否合法
        if (null == str || str.trim().equals("")){
            return 0;
        }
        // symbol=0,说明该数为正数;symbol=1,该数为负数;start用来区分第一位是否为符号位
        int symbol = 0;
        int start = 0;
        char[] chars = str.trim().toCharArray();
        if ('+' == chars[0]){
            start = 1;
        }else if ('-' == chars[0]){
            start = 1;
            symbol = 1;
        }
        int result = 0;
        for (int i = start; i < chars.length; i++) {
            if (chars[i] > '9' || chars[i] < '0'){
                return 0;
            }
            int sum = result * 10 + (int) (chars[i] - '0');
            if ((sum - (int)(chars[i] - '0')) / 10 != result){
                return 0;
            }
            result=result * 10 + (int) (chars[i] - '0');
            /*
             * 本人认为java热门第一判断是否溢出是错误的,举个反例
             * 当输入为value=2147483648时,在计算机内部的表示应该是-2147483648
             * 显然value>Integer.MAX_VALUE是不成立的
            */
        }
        // 注意:java中-1的n次方不能用:(-1)^n .'^'异或运算
        // 注意,当value=-2147483648时,value=-value
        result = (int) Math.pow(-1, symbol) * result;
        return result;
    }

    // 1.功能测试(正、负、零、带有正负号的数字)
    @Test
    public void testA(){
        System.out.println(new Solution67().StrToInt("1948243")==1948243);

        System.out.println(new Solution67().StrToInt("+1948243")==1948243);

        System.out.println(new Solution67().StrToInt("-1948243")==-1948243);

        System.out.println(new Solution67().StrToInt("-0")==0);

    }
    // 2.边界值测试(最大正整数,最小负整数)
    @Test
    public void testB(){
        String str = "+2147483647";
        int strToInt = new Solution67().StrToInt(str);
        System.out.println(strToInt);

        String str1 = "-2147483648";
        int strToInt1 = new Solution67().StrToInt(str1);
        System.out.println(strToInt1);
    }
    // 3.特殊测试(null,数空字符串,仅有正负号,非法字符)
    @Test
    public void testC(){
        System.out.println(new Solution67().StrToInt(""));

        System.out.println(new Solution67().StrToInt(null));

        System.out.println(new Solution67().StrToInt("1a33"));

        System.out.println(new Solution67().StrToInt("+++"));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值