【Java】 剑指offer(20) 表示数值的字符串
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【Java】 剑指offer(20) 表示数值的字符串,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4057字,纯文字阅读大概需要6分钟。
内容图文
本文参考自《剑指offer》一书,代码采用Java语言。
题目
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串“+100”、“5e2”、“-123”、“3.1416”及“-1E-16”都表示数值,但“12e”、“1a3.14”、“1.2.3”、“+-5”及“12e+5.4”都不是。
思路
刚开始的思路是从头到尾遍历,对遇到的不同情况进行分析,但很容易出错。因此采用《剑指OFFER》一书的方法:将数字的形式总结为:(A.B E/e A) ,按顺序进行判断(A代表带符号整数,B代表不带符号整数)。
测试算例
1.功能测试(正负数;含整数与不含整数部分;含与不含小数部分;含与不含指数部分;不匹配情况)
2.特殊测试(null,空字符串)
完整Java代码
(含测试代码)
/** * * @Description 面试题20:表示数值的字符串 * * @author yongh * @date 2018年9月22日 上午11:15:13 */ // 题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如, // 字符串“+100”、“5e2”、“-123”、“3.1416”及“-1E-16”都表示数值,但“12e”、 // “1a3.14”、“1.2.3”、“+-5”及“12e+5.4”都不是 public class NumericStrings { /* * 数字的基本格式为:(A.B E/e A) ,按顺序进行判断 * //A代表带符号整数,B代表不带符号整数 * 小心:时刻要注意数组越界问题! */ public boolean isNumeric(char[] str) { if (str == null || str.length == 0) return false; int[] index = new int[1]; index[0] = 0; // 用于记录当前字符位置 // 先判断A boolean isNumeric; //用于记录是否满足条件 isNumeric = isInteger(str, index); // 判断B if (index[0] < str.length && (str[index[0]] == '.')) { index[0]++; isNumeric = isUnsignedInteger(str, index) || isNumeric; // .B和A.和A.B形式均可以 } // 判断e后面的A if (index[0] < str.length && (str[index[0]] == 'e' || str[index[0]] == 'E')) { index[0]++; isNumeric = isInteger(str, index) && isNumeric; } if (isNumeric && index[0] == str.length) return true; else return false; } private boolean isInteger(char[] str, int[] index) { // 用int[]才能传值,int的话需要定义index为全局变量 if (index[0] < str.length && (str[index[0]] == '+' || str[index[0]] == '-')) index[0]++; return isUnsignedInteger(str, index); } private boolean isUnsignedInteger(char[] str, int[] index) { int start = index[0]; while (index[0] < str.length && (str[index[0]] - '0' <= 9 && str[index[0]] - '0' >= 0)) index[0]++; if (index[0] > start) return true; else return false; } // =======测试代码========= void test(String testName, char[] str, boolean expected) { System.out.print(testName + ":"); if (isNumeric(str) == expected) System.out.println(" passed!"); else System.out.println(" failed!"); } void test1() { char[] str = null; test("test1", str, false); } void test2() { char[] str = {}; test("test2", str, false); } void test3() { String string ="e3"; char[] str=string.toCharArray(); test("test3", str, false); } void test4() { String string ="3e1.2"; char[] str=string.toCharArray(); test("test4", str, false); } void test5() { String string ="e3"; char[] str=string.toCharArray(); test("test5", str, false); } void test6() { String string ="1.2e3"; char[] str=string.toCharArray(); test("test6", str, true); } void test7() { String string ="-.2e3"; char[] str=string.toCharArray(); test("test7", str, true); } void test8() { String string ="-.2e-3"; char[] str=string.toCharArray(); test("test8", str, true); } void test9() { String string ="1.e-3"; char[] str=string.toCharArray(); test("test9", str, true); } void test10() { String string ="1."; char[] str=string.toCharArray(); test("test10", str, true); } void test11() { String string =".2"; char[] str=string.toCharArray(); test("test11", str, true); } void test12() { String string ="12e3"; char[] str=string.toCharArray(); test("test12", str, true); } public static void main(String[] args) { NumericStrings demo = new NumericStrings(); demo.test1(); demo.test2(); demo.test3(); demo.test4(); demo.test5(); demo.test6(); demo.test7(); demo.test8(); demo.test9(); demo.test10(); demo.test11(); demo.test12(); } }
test1: passed! test2: passed! test3: passed! test4: passed! test5: passed! test6: passed! test7: passed! test8: passed! test9: passed! test10: passed! test11: passed! test12: passed!NumericStrings
收获
对字符串进行依次判断时,定义一个Boolean变量,每判断一部分进行更新,最终该变量即为判断结果,不需要进行循环判断。(即本例中的isNumeric变量)
内容总结
以上是互联网集市为您收集整理的【Java】 剑指offer(20) 表示数值的字符串全部内容,希望文章能够帮你解决【Java】 剑指offer(20) 表示数值的字符串所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。