1、问题描述
2、算法分析
方法1::::
1)我们要把所有的数字子字符串都返回,可考虑存储结构来保存提取出来的所有数字,因为不知道原字符串中会有多少个数字,且返回升序结果,所以我们采用了优先队列(最小堆heap)来存得到的每一个数字;
2)具体的处理过程其实和《美团笔试练题1》的思维一致,记录当前数字字符串的结尾和长度,然后分割出来;
3、代码
import java.io.*;
import java.util.*;
class test
{
public static void main (String[] args) throws java.lang.Exception
{
//处理IO
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();//输入原始字符串
//算法部分
int end =0;//维护当前数字字符串的结尾下标
int count=0;//记录当前数字字符串的长度
PriorityQueue<Integer> res = new PriorityQueue<>();//最小堆
for(int i=0;i<s.length();i++){
if('0'<= s.charAt(i)&&s.charAt(i)<='9'){
count++;
}else{
if(count>0){
//把当前数字分割出来
String maxnum=s.substring(i-count,i);//左闭右开
res.offer(Integer.parseInt(maxnum));
//在下一个数字开始前,count置为0,重新统计
count=0;
}
}
//特殊情况考虑,如果原始字符串结尾也是数字,那么上面的代码会直接执行if()然后
//退出,那么原始字符串中的最后一个数字便不能输出,所以这里单独考虑
if(i==s.length()-1 && '0'<=s.charAt(i) && s.charAt(i)<='9' ){
String maxnum=s.substring(s.length()-count,s.length());//左闭右开
res.offer(Integer.parseInt(maxnum));
}
}
//升序输出结果
while(!res.isEmpty()){
System.out.println(res.poll());
}
}
}
---------------------------------------------------------------------
方法2:::
方法1采用的思想上,在遍历的过程中,记录每一个数字字符串的长度和结束下标,然后再分割出来;
因为涉及到字符串的反复操作,其实我们很容易想到StringBuilder\StringBuffer,所以我们可以在遍历的过程中,每遍历到一个数字就存入StringBuilder中,当下一个字符不是数字,说明当前的数字子字符串结束,然后把StringBuilder的结果放到结果队列中,然后StringBuilder清空,开始下一个数字子字符串的存储。
import java.io.*;
import java.util.*;
import java.util.Scanner;
class test
{
public static void main (String[] args) throws java.lang.Exception
{
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
int len = s.length();
int tmpIndex=0;
PriorityQueue<Integer> res = new PriorityQueue<>();//优先队列(小顶堆)
StringBuilder sb = new StringBuilder();
int numlen=0;
for(int i=0;i<len;i++){
if(s.charAt(i) >= '0' && s.charAt(i) <= '9'){
sb.append(s.charAt(i));
}else{
if(sb.length()!=0){
res.offer(Integer.parseInt(sb.toString()));
System.out.println(sb.toString());
sb.setLength(0);//sb清空操作,开始下一个数字子字符串
}
}
}
}
}