剑指offer系列之四十八:把字符串转成整数

题目描述

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数

这里的关键是要对输入的字符串进行全面的考虑。包括字符串是否有效的判断、是否是负数以及字符串表示的整数是否越界等问题。对于字符串有效性的判断主要是null以及空串的判定;负数之所以需要判断是因为在计算的时候是有用的;而是否越界的问题也是需要考虑的。因为一个越界的数是不可能计算出来的,那么这时候可以简单返回一个0,表示越界的数。这三点都考虑之后,整体代码的健壮性就比较好了。下面是这种思路的实现代码(已被牛客AC),详细的已经在代码的注释中给出了:

package com.rhwayfun.offer;

public class StringToInt {

    // 设置一个成员变量表示发生溢出
    boolean isValid = true;

    public int StrToInt(String str) {
        // 设置一个变量是否是负数
        boolean isNegtive = false;
        long sum = 0;
        // 第一个字符的下标
        int begin = 0;
        if (str != null && !str.equals("")) {
            // 判断第一个字符是否是正数或者负数
            char firstChar = str.charAt(begin);
            if (firstChar == '+' || firstChar == '-') {
                begin = 1;
                if (firstChar == '-')
                    isNegtive = true;
            }
            sum = strToIntCore(str, begin, isNegtive);
        }
        isValid = false;
        return (int) sum;
    }

    private long strToIntCore(String str, int begin, boolean isNegtive) {
        int flag = isNegtive ? -1 : 1;
        long sum = 0;
        // 需要转换的字符下标的起始位置
        int index = begin;
        while (index < str.length()) {
            // 如果字符是从0到9的话
            char curChar = str.charAt(index);
            if (curChar >= '0' && curChar <= '9') {
                sum = sum * 10 + flag * (curChar - '0');
                // 考虑越界的情况,直接返回最小值或者最大值
                if ((isNegtive && sum < Integer.MIN_VALUE) || (!isNegtive
                        && sum > Integer.MAX_VALUE)) {
                    return 0;
                }
            }else{
                return 0;
            }
            index++;
        }
        return sum;
    }

    public static void main(String[] args) {
        String str = "-0";
        int a = new StringToInt().StrToInt(str);
        System.out.println(a);
    }
}
时间: 2024-12-09 12:24:48

剑指offer系列之四十八:把字符串转成整数的相关文章

剑指offer系列之十八:顺时针打印矩阵

题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 由于每打印完一圈都会改变其起始坐标,所以需要先确定矩阵大小与这个起始坐标的关系,比如一个4阶矩阵,第一圈的起始坐标是(0,0),第二圈的起始坐标是(1,1),打印两圈之后就打印结束了.在比如一个5阶矩阵,前两圈是一样的,第三圈的

剑指offer系列之三十八:判断是否是平衡二叉树

题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 所谓平衡二叉树就对某个结点来讲,其左子树的深度与右子树深度的绝对值不超过1.由于需要对每个节点进行判断,所以可以采用递归的思路进行解决.具体思路是:先求出根节点的左右子树的深度,并对两者进行判断,如果没有满足左右子树的深度的绝对值不超过1的条件,那么就不是平衡二叉树.下一步,自然就是分别对根节点的左右子树进行递归判断了,这样一直到叶子结点.整棵二叉树的所有节点都判断完毕,所以这个问题就解决了.下面是这种思路的实现代码(已被牛客AC): p

剑指offer系列之四十二:约瑟夫环问题

题目描述 每年六一儿童节,NowCoder都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为NowCoder的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指定一个数m,让编号为0的小朋友开始报数.每次喊到m的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0-m-1报数-.这样下去-.直到剩下最后一个小朋友,可以不用表演,并且拿到NowCoder名贵的"名侦探柯南"

剑指offer系列之四十六:求1到n的和

题目描述 求1+2+3+-+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 如果不能使用上面的操作,那么只能使用递归操作了.使用递归操作的思路是让函数不断调用自己,每调用一次值就减少1,这样完成了递归操作.还有一个问题是如何实现n范围的判断呢?注意到递归调用的n的值最小是1,所以可以通过逻辑与运算,判断是否递归到1.如果递归调用到1,那么递归就结束,并返回最后的结果.下面是这样思路的实现代码(已被牛客AC): packag

剑指offer系列之四十:和为S的连续正数序列

题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22.现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出描述: 输出所有和为S的连续正数序列.序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序 此题的思路是:设定两个指针,一个指向第一个

剑指offer系列之四十九:数组中重复的数字

题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3. 此题的思路还是比较简单的,与之前找出只出现一次的数字的题目有些类似,基本思路还是创建一个Map容器,key是出现的数字,value则是该数字出现的次数.在遍历数组的过程中,只要容器中已经出现了该数字,那么就直接返回给数组,

剑指offer系列之四十四:翻转单词顺序

题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"student. a am I".后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是"I am a student.".Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? 可以发现,要对一个句子进行翻转,可以先对整个句子进行翻转,之后再对每个单词进行翻转.而不论是返

剑指offer系列之四十五:左旋转字符串

题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S="abcXYZdef",要求输出循环左移3位后的结果,即"XYZdefabc".是不是很简单?OK,搞定它! 同上一题思路差不多,可以把需要左旋的字符串看成一部分,其他的字符串看成另一部分,比如字符串"abcdef",需要输出左移2位的结果,可以把字符串&q

剑指offer系列之十二:调整数组顺序使奇数位于偶数前面

题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 这道题第一思路自然是这样的:从头开始遍历这个数组,如果遇到偶数就把这个数之后的所有数往前移动一位,这样数组会留出一个空位,移动完毕之后把该偶数放到该空位即可.这样处理的话需要两次循环,一次是遍历,另一次是移位,所以时间复杂度是O(n2).下面是这种思路的实现代码(已被牛客AC): public void reOrd