剑指offer系列之五十二:表示数值的字符串

题目描述

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。

这题与前面吧字符串转为数值有些类似,但是这里是判断是否一个字符串可以转为数值。从测试用例来看,表示的字符串有三类:整数、浮点数和科学计数法表示的数值。那么基本思路就是根绝这三种类型进行判断:对于整数比较容易判断,只要字符串没有出现非0到9的字符,就可以跳过,否则返回错误;对于浮点数,因为可能会出现多个小数点的情况,所以如果展开判断会很复杂,只要考虑是正确的情况就可以——即只出现一个小数点的情况,至于小数点后面的字符串则与判断整数是一样得思路;对于科学计数法表示的数值,无非就两类一种是e一种是E,至于e或者E后面的字符串的判断也是与整数的判断是一样的。而且,注意到,如果e或者E后面没有数字的话是不被允许的。综合以上考虑,实现的代码如下(已被牛客AC):

package com.rhwayfun.offer;

public class IsStrNumber {

    public boolean isNumeric(char[] str) {
        if(str == null || str.length == 0) return false;
        //首先如果两边有空格的话需要先去掉空格
        int index = 0;
        int length = str.length;
        while(index < length && str[index] == ' ') index++;
        if(index >= length) return false;
        while(str[length - 1] == ' ') length--;
        //第一步:判断是否是一个整数
        //如果第一位是+或者-号的时候
        if(str[index] == '+' || str[index] == '-') index++;
        if(index >= length) return false;
        //如果后面是数字的话就跳过
        while(index < length && str[index] >= '0' && str[index] <= '9') index++;
        if(index == length) return true;
        int index2 = index;
        //第二步:判断是否还有小数部分
        if(str[index] == '.'){
            index++;
            if(index == length) return true;
            index2 = index;
            while(index < length && str[index] >= '0' && str[index] <= '9') index++;
            if(index == index2) return false;
            if(index == length) return true;
        }

        //第三步:判断是否有科学计数法
        if(str[index] == 'e' || str[index] == 'E'){
            index++;
            if(index == length) return false;
            if(str[index] == '+' || str[index] == '-') index++;
            index2 = index;
            while(index < length && str[index] >= '0' && str[index] <= '9') index++;
            if(index == index2) return false;
            if(index == length) return true;
        }
        return false;
    }

    public static void main(String[] args) {
        String s = "1.2.3";
        boolean b = new IsStrNumber().isNumeric(s.toCharArray());
        System.out.println(b);
    }
}
时间: 2025-01-30 01:24:59

剑指offer系列之五十二:表示数值的字符串的相关文章

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

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

剑指offer系列之五十四:按之字形顺序打印二叉树

题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 此题明显是层序遍历的思路.由于需要按照之字形打印每一层,相当于在打印每一行之前需要判断上一行打印的顺序.比如,如果上一行打印的顺序使从左到右,那么下一行的打印顺序应该是从右到左.实现的这点可以采用奇数行从左到右打印,偶数行从右到左进行打印.还可直接设置 一个布尔变量,每打印一行就改变一次该变量的值.其他的就是层序遍历的思路了.下面是我实现的代

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

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

剑指offer系列之五十五:把二叉树打印成多行

题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 此题实际上与上面一题是重复了,总体还是层序遍历的思路,只不过现在不需要在打印每一行之前对打印顺序进行判断了,所以可以在前面一题的代码进行简单的修改就可以实现题目的要求了.不多说,直接看代码(已被牛客AC): package com.rhwayfun.offer; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue;

剑指offer系列之五十:构建乘积数组

题目描述 给定一个数组A[0,1,-,n-1],请构建一个数组B[0,1,-,n-1],其中B中的元素B[i]=A[0]A[1]-A[i-1]*A[i+1]-*A[n-1].不能使用除法. 在代码中已经给出了此题的解题思路,直接看代码(已被牛客AC): package com.rhwayfun.offer; public class ConstructMultipleArray { /** * 基本思路是把前半部分与后半部分的结果保存到不同的数组中 * @param A * @return */

剑指offer系列之五十六:对称二叉树的判断

题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 前面有一题是打印输出某二叉树的镜像,回想其实现的思路是:采用层序遍历的思路对每一个遍历的节点,如果其有孩子节点,那么就交换两者.直到遍历的节点没有孩子节点为止,然而此题是对二叉树木镜像的判断,明显是更简单的,只需要进行两个判断:对节点的左孩子与其兄弟节点右孩子的判断以及对节点右孩子与其兄弟节点左孩子的判断.这样就完成对对一棵二叉树是否对称的判断.下面是具体的实现代码(已被牛客

剑指offer系列之五十九:链表中环的入口节点

题目描述 一个链表中包含环,请找出该链表的环的入口结点. 此题的思路其实 很简单,之所以出现环,是因为在整个链表中出现了重复的节点,而遇到的第一个重复的节点就是环的入口节点.所以可以使用Set来保存遍历到的节点,因为Set集合是不允许出现重复元素的,所以当一个节点被第二次添加的时候,往Set中放元素是失败的.所以可以利用这一点找出第一个重复的元素.基于这种思路的代码比较简洁,代码如下(已被牛客AC): import java.util.HashSet; import java.util.Set;

剑指offer系列之三十二:寻找丑数

题目描述 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 因为丑数只有2.3和5这三个因子,那么如果一个是丑数的话,一定是可以被这个三个因子整除的,所以我们可以通过把一个数一直被三个因子除,这样最后如果该数变成1的话(因为第一个丑数是1),那么就验证了该数就是丑数.那么如果想找出第k个丑数的话,就可以从第一个数开始循环,对每一个数进行丑数的判断,从而找到符合要求的第

剑指offer系列之六十二:数据流中的中位数

题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 根据题目的意思,就是对数据流中的数据进行排序然后得到其中位数.要解决的关键问题是如何在读入数据的时候就对数据进行排序.实际上可以看成是插入排序算法的应用,可以维持一个List集合,保证每次读入数据集合中的数据都是排序的.基本思路是:从集合的第一个元素开始,依次比较与新读入的元素的大小关系,从而把新读入