题解 | 【模板】集合操作
【模板】集合操作
https://www.nowcoder.com/practice/a37b91f84cdf490b8d8b990794211135
知识点,TreeSet详情:
基于TreeMap红黑树实现(TreeSet内部使用TreeMap实现),元素有序,不可重复,操作时间复杂度O(logn)
导航和范围操作:TreeSet特有
TreeSet<Integer> nums = new TreeSet<>(Arrays.asList(10, 20, 30, 40, 50)); // 获取最小/最大元素 Integer first = nums.first(); // 10 Integer last = nums.last(); // 50 // 小于/小于等于某元素的最大元素 Integer lower = nums.lower(25); // 20(<25) Integer floor = nums.floor(25); // 20(≤25) // 大于/大于等于某元素的最小元素 Integer higher = nums.higher(25); // 30(>25) Integer ceiling = nums.ceiling(25); // 30(≥25) // 移除并返回最小/最大元素 Integer pollFirst = nums.pollFirst(); // 移除并返回10 Integer pollLast = nums.pollLast(); // 移除并返回50
题解:
import java.util.*;
public class Main {
// 为了在静态方法中使用,也是用静态变量,因为静态方法只能访问静态变量
static TreeSet<Integer> ts = new TreeSet<>();
public static void insertValue(int x) {
// TODO: 实现插入逻辑
// 直接使用TreeSet的add方法
ts.add(x);
}
public static void eraseValue(int x) {
// TODO: 实现删除逻辑
ts.remove(x);
}
public static boolean xInSet(int x) {
// TODO: 实现存在性检查
return ts.contains(x);
}
public static int sizeOfSet() {
// TODO: 返回集合大小
return ts.size();
}
public static int getPre(int x) {
// TODO: 实现找前驱
// 前驱,小于x的最大的数,因此使用方法lower()
// 判断前驱是否为null
Integer pre = ts.lower(x);
return pre != null ? pre : -1;
}
public static int getBack(int x) {
// 找到后继,即为 大于x的最小的数
Integer back = ts.higher(x);
return back != null ? back : -1;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int q = scanner.nextInt();
while (q-- > 0) {
int op = scanner.nextInt();
switch (op) {
case 1:
insertValue(scanner.nextInt());
break;
case 2:
eraseValue(scanner.nextInt());
break;
case 3:
System.out.println(xInSet(scanner.nextInt()) ? "YES" : "NO");
break;
case 4:
System.out.println(sizeOfSet());
break;
case 5:
System.out.println(getPre(scanner.nextInt()));
break;
case 6:
System.out.println(getBack(scanner.nextInt()));
break;
}
}
scanner.close();
}
}
#java#
美的集团公司福利 873人发布
