选出字符串中连续出现的数字当中的最大数
其实这是一道面试题,具体要求如下:
*给定一个字符串,返回该字符串中连续出现的数字当中最大的一个,例如给定 "5ds45%^d2&c544d1" 则返回 544。如果连续出现的数字超过了 int 的取值范围,则返回 int 的最大值或者最小值,不能使用 long 类型及其包装类。
ok,先说说思路:
- 去除字符串收尾两端的空格;
- 将非数字部分替换成" ",也就是空字符串;
- 用空字符串进行切割,返回数字部分,用TreeSet接收,因为TreeSet有自动排序的功能,返回TreeSet的最后一个元素。
你以为这样就完了吗?当然不是啦,注意捕获异常!!!
当然这只是我的一种思路,牛逼的完全可以用正则表达式搞定,或者分类讨论判断字符串连续出现数字,但是要注意数组下标越界问题。总而言之,仁者见仁智者见智!
ok, 直接上代码:
package com.czj.demo;
import java.util.TreeSet;
/**
* @Author: czj
* @Date: 2019/1/27
*/
public class Question {
public static int getInt(String str) {
//去掉首尾两端空格
String trim = str.trim();
//遍历 替换掉字符串中非数字部分字符
StringBuilder sb = new StringBuilder();
for (char c : trim.toCharArray()) {
//注意保留负数
if (Character.isDigit(c)) {
sb.append(c);
} else if (c == '-') {
sb.append(" -");
} else {
sb.append(" ");
}
}
//空字符串进行切割 去掉不是连续数字部分
String[] intStr = sb.toString().split(" ");
TreeSet<Integer> set = new TreeSet();
for (String s : intStr) {
if (s.length() > 0) {
//如果超出取值范围,则进行捕获
try {
set.add(Integer.valueOf(s));
} catch (NumberFormatException e) {
//正负数都可能异常,分类讨论
if (s.startsWith("-")) {
set.add(Integer.MIN_VALUE);
} else {
set.add(Integer.MAX_VALUE);
}
}
}
}
//因为TreeSet会自动排序,直接返回最后一个元素即可
return set.last();
}
}
经过测试没有问题~