快手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,76543211100
        if (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爲空時(即沒有靚號時),輸出null
        if (!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>>() {
            @Override
            public int compare(Map.Entry<String, Double> o1, Map.Entry<String, Double> o2) {
                return o2.getValue().compareTo(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轉義序列、轉義字符彙總。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章