OJ1181. 【软件认证】可漫游服务区

文章讲述了如何根据漫游限制区域的前缀范围判断移动电话用户可以在哪些服务区漫游,并按照字典序降序输出可漫游的区域。如果没有任何漫游服务,输出empty。
摘要由CSDN通过智能技术生成

题目描述

漫游(roaming)是一种移动电话业务,指移动终端离开自己注册登记的服务区,移动到另一服务区(地区或国家)后,移动通信系统仍可向其提供服务的功能。

用户可签约漫游限制服务,设定一些限制区域,在限制区域内将关闭漫游服务。

现给出漫游限制区域的前缀范围,以及一批服务区(每个服务区由一个数字字符串标识),请判断用户可以漫游的服务区,并以字典序降序输出;如果没有可以漫游的服务区,则输出字符串empty。

解答要求
时间限制:1000ms, 内存限制:256MB
输入
首行输入两个整数m n,取值范围均为 [1, 1000]。
随后 m 行是用户签约的漫游限制区域的前缀范围,每行格式为start end(含start和end),start和end是长度相同的数字字符串,长度范围为[1, 6],且 start <= end。
接下来 n 行是服务区列表,每行一个数字字符串表示一个服务区,长度范围为[6,15]。

输出
字典序降序排列的可漫游服务区列表,或字符串empty

样例
输入样例 1 复制

2 4
755 769
398 399
3970001
756000000000002
600032
755100
输出样例 1

600032
3970001
提示样例 1
服务区 755100 和 756000000000002 的前缀在漫游限制 [755,769] 范围内,不能漫游。 3970001 和 600032,不在任何漫游限制范围内,因此可以漫游,按字典序降序先输出 600032。

输入样例 2 复制

1 2
4 4
4000000
495555
输出样例 2

empty
// ok

/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved.
 */

package ahwoj;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

public class ManYouLimit {
    // 判断一个服务区是否在漫游限制内,若在,不可以漫游,若不在限制内,则可漫游
    static List<String> list = new ArrayList<>();
    public static String[] getRoamingArea(List<String[]> restricts, String[] areas) {
        list.addAll(Arrays.asList(areas));
        for (int i = 0; i < areas.length; i++) {
            for (int j = 0; j < restricts.size(); j++) { // 遍历限制
                int limitLen = restricts.get(j)[0].length();
                int start = Integer.parseInt(restricts.get(j)[0]);
                int end = Integer.parseInt(restricts.get(j)[1]);
                String prefix = areas[i].substring(0, limitLen);
                // 比较前缀是否在limts的start和end之间,
                if (Integer.parseInt(prefix) >= start && Integer.parseInt(prefix) <= end) {
                    list.remove(areas[i]);
                    break;
                }
            }

        }
        // 将列表按字典降序排序,变为数组
        // Comparator还提供了Comparator.naturalOrder方法,该方法对对象集合施加自然顺序。
        // Comparator.reverseOrder()); // 对对象集合进行反向自然排序
        list.sort(Comparator.reverseOrder()); // 对对象集合进行反向自然排序
        return list.toArray(new String[0]);
    }

    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in, StandardCharsets.UTF_8.name());
        int mRow = cin.nextInt();
        int nRow = cin.nextInt();
        int mCow = 2;
        List<String[]> range = new ArrayList<>();
        for (int i = 0; i < mRow; i++) {
            String[] row = new String[mCow];
            for (int j = 0; j < mCow; j++) {
                row[j] = cin.next();
            }
            range.add(row);
        }
        String[] numbers = new String[nRow];
        for (int i = 0; i < nRow; i++) {
            numbers[i] = cin.next();
        }
        cin.close();
        String[] results = getRoamingArea(range, numbers);
        if (results.length == 0) {
            System.out.println("empty");
        } else {
            for (String result : results) {
                System.out.println(result);
            }
        }
    }
}


  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值