选出字符串中连续出现的数字当中的最大数

选出字符串中连续出现的数字当中的最大数

其实这是一道面试题,具体要求如下:
*给定一个字符串,返回该字符串中连续出现的数字当中最大的一个,例如给定 "5ds45%^d2&c544d1" 则返回 544。如果连续出现的数字超过了 int 的取值范围,则返回 int 的最大值或者最小值,不能使用 long 类型及其包装类。

ok,先说说思路:

  1. 去除字符串收尾两端的空格;
  2. 将非数字部分替换成" ",也就是空字符串;
  3. 用空字符串进行切割,返回数字部分,用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) && c != '-') {
                sb.append(" ");
            } else {
                sb.append(c);
            }
        }
        //空字符串进行切割  去掉不是连续数字部分
        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();
    }
    
}

经过测试没有问题~

猜你喜欢

转载自blog.csdn.net/qq_42815754/article/details/86664855
今日推荐