每日一练31——Java这是一个数字吗?(8kyu)

题目

给定一个字符串s,编写一个方法(函数),如果它有一个有效的单个整数或浮点数,将返回true,否则返回false。

有效的例子应该返回true:

isDigit("3")
isDigit(" 3 ")
isDigit("-3.23")
应该返回false:

isDigit("3-4")
isDigit(" 3 5")
isDigit("3 5")
isDigit("zero")

测试用例:

import org.junit.Test;
import static org.junit.Assert.assertEquals;

public class DigitTest {
  
    MyUtilities myUtil = new MyUtilities();

@Test
    public void test0() throws Exception 
    {   
        assertEquals(false,myUtil.isDigit("s2324"));
    }
     @Test
    public void test1() throws Exception 
    {   
        assertEquals(true,myUtil.isDigit("-234.4"));
    }

}

解题

我的:

这题搞了我一天,最后还是借助了网友的力量,一开始我也设想过正则,但是一直写不出最完善的正则表达式,最终作罢。

public boolean isDigit(String s) {
    char[] arrs = s.toCharArray();
    boolean flag = false;
    for (int i = 0, point = 0, nume1 = 0, nume2 = 0; i < arrs.length; i++) {
        flag = true;
        //如果数字中出现其他字符,为NO。
        if ((arrs[i] < 48 || arrs[i] > 57) && arrs[i] != '.' && arrs[i] != 'E' && arrs[i] != '-') {
            flag = false;
            break;
        }
        if (arrs[i] == 'E') {
            nume1++;
            //如果'E'出现在第一个和最后一个,为NO
            if (i + 1 == arrs.length || i == 0) {
                flag = false;
                break;
            }
        } else if (arrs[i] == '.') {
            point++;
            //如果'.'出现在第一个或者最后一个,或者出现在'E'之后,为NO
            if (i + 1 == arrs.length || i == 0 || nume1 > 0) {
                flag = false;
                break;
            }
        } else if (arrs[i] == '-') {
            nume2++;
            //如果'-'出现在第一个为yes,但'-'没有紧挨着在'E'之后,为NO
            if (i == 0) {
                break;
            } else if (arrs[i - 1] != 'E') {
                flag = false;
                break;
            }
        }
        //如果'E','.','-'出现的次数多于一个,为NO
        if (nume1 > 1 || nume2 > 1 || point > 1) {
            flag = false;
            break;
        }
    }
    return flag;
}

别人的:

1、正则表达式法

public class MyUtilities{
 
  private static final String NUMBER_REGEX =
      "\\s*"      // any amount of whitespace
      + "-?"      // optional negative sign
      + "\\d+"    // one or more digits
      + "(:?"     // start of factional part
        + "\\."   // literal period
        + "\\d+"  // one or more digits
      + ")?"      // fractional part is optional
      + "\\s*";   // any amount of whitespace

  public boolean isDigit(String s)
  {
      return s.matches(NUMBER_REGEX);
  }
}
public class MyUtilities{

  public boolean isDigit(String s)
  {
      return s.matches("[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)");
  }
}

2、取巧低效法,实际不会将异常用作控制流

public class MyUtilities{

  public boolean isDigit(String s)
  {
    try
    {
      Double.parseDouble(s);
      return true;
    }catch(Exception e)
    {
      return false;
    }
  }
}

思考

这道题始终没有领会出题者的意图。饶了很多弯,真是绞尽脑汁,而且正则不够精通。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,697评论 19 139
  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,613评论 0 13
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,880评论 0 3
  • FreeCodeCamp - Basic JavaScript 写在前面: 我曾经在进谷前刷过这一套题,不过当时只...
    付林恒阅读 16,589评论 5 28
  • 今天领导找我面谈,问我有没有职业规划,我说,没有啊。 对方表示这话没法接。 问我你作为一个外地人,有什么样的规划,...
    寞守橙妖阅读 481评论 0 0

友情链接更多精彩内容