题目描述
漫游(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);
}
}
}
}