admin 管理员组

文章数量: 887031

快手2020实习生招聘春招校招真题——手机靓号筛选(Java正则表达式,解题,详细解释,答案)

一、快手2020实习生招聘春招校招真题

1.题目描述

题目描述:

手机号目前是11位,一般前三位是运营商固定号段,如:188,189,130,后8位为随机数字。现在需要实现一个程序对输入的一批手机号进行靓号筛选和价值排序以确定手机号的售卖价格。
靓号定义:
-后8位中连续3个或3个以上数为顺子号码,例如:xx0123xx xx5432xx
-后8位中连续3个或3个以上数重复为豹子号,例如:xx6666xx xx888xxx
价值规则:
-连续出现顺子号或豹子号位数越多价值越大,例如:xx1234xx大于xx888xxx
-相同位数的豹子号价值大于顺子号价值,例如xx6666xx大于xx2345xx
-一个号码中同时有顺子和豹子的,以价值大的作为该号码价值
-相同价值的手机号,输出顺序和输入顺序一致(稳定排序)

输入描述:

一行字符串,包含若干个合法的手机号,手机号之间以逗号分隔

输出描述:

按价值降序排序之后的靓号,同样以逗号分隔,如果不存在靓号输出null

示例1 输入输出示例仅供调试,后台判题数据一般不包含示例

输入

15112347234,15176313245,15176313346,15176313325, 15166667234,15188847234

输出

15166667234,15112347234,15188847234

2.Java代码实现

下述代码中实现了上述题目描述的绝大部分要求,但是由于考试时间短暂,未实现以下题目要求:

相同价值的手机号,输出顺序和输入顺序一致(稳定排序)

还请各位阅读本文章的大佬可以给出完美地解决方案,谢谢各位啦!

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.regex.Pattern;public class GenercisTest {public static void main(String[] args) {//将从输入获得的待检测和排序的一系列手机号码String numberString="";//字符串类型的手机号码String phoneNumber="";Map<String,Double> map = new HashMap<>();Scanner scanner=new Scanner(System.in);//从输入获得待检测和排序的一系列手机号码,如:13412384754,12345771122,11111133333,11111122222,,11111100000,76543211100if (scanner.hasNext()){numberString=scanner.next();}//以英文逗号作为分隔符得到一个字符串类型的数组,用于存储各个手机号码String[] stringArray=numberString.split(",");//手机号码权重double weight=0;for (int j = 0; j < stringArray.length; j++) {phoneNumber=stringArray[j];for (int i = 3; i < 9; i++) {//相同字符if (Pattern.matches("\\d{3}.*(\\d)\\1{"+(i-1)+"}.*",phoneNumber)){map.put(phoneNumber,(double)i);}//递增if (Pattern.matches("\\d{3}.*(?:0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)|6(?=7)|7(?=8)|8(?=9)){"+(i-1)+"}\\d.*",phoneNumber)){map.put(phoneNumber,i+0.5);}//递减if (Pattern.matches("\\d{3}.*(?:9(?=8)|8(?=7)|7(?=6)|6(?=5)|5(?=4)|4(?=3)|3(?=2)|2(?=1)|1(?=0)){"+(i-1)+"}\\d.*",phoneNumber)){map.put(phoneNumber,i+0.5);}}}//当map为空时(即没有靓号时),输出nullif (!map.isEmpty()){sortByValue(map);}}// 按照值排序static void sortByValue(Map map) {//最后按照权重排序的手机号码字符串String finalNumberString="";List<Map.Entry<String, Double>> list = new ArrayList<Map.Entry<String, Double>>(map.entrySet());Collections.sort(list, new Comparator<Map.Entry<String, Double>>() {@Overridepublic int compare(Map.Entry<String, Double> o1, Map.Entry<String, Double> o2) {return o2.getValue()pareTo(o1.getValue());}});for (Map.Entry<String, Double> mapping : list) {//System.out.println("键:" + mapping.getKey() + " 值:" + mapping.getValue());finalNumberString+=mapping.getKey()+",";}//去掉最后一个英文逗号,finalNumberString=finalNumberString.substring(0,finalNumberString.length()-1);System.out.print(finalNumberString);}}

本文参考文献:
[1]靓号正则表达式(前后向查找等) 和 apache正则包使用
[2]正则表达式(靓号过滤)
[3]靓号,java正则表达式的实现
[4]JAVA 正则表达式 (超详细)
[5]JAVA正则表达式:Pattern类与Matcher类详解(转)
[6]Java 正则表达式的用法和实例
[6]Java 正则表达式
[7]正则表达式\1,\2和\1,\2的理解
[8]关于java正则表达式中的 ^和$的使用
[9]反斜杠加3个数字是什么编码?JAVA转义序列、转义字符汇总。

本文标签: 快手2020实习生招聘春招校招真题手机靓号筛选(Java正则表达式 解题 详细解释 答案)