Java试题-选择题(5)

Java试题-选择题(5)

题目

  1. 类Person里面有个方法sleep(),如果直接用Person.sleep(),则方法sleep前面必须用的关键词是?
    A:class
    B:static
    C:public
    D:final

  2. 下列哪个类的声明是正确的 ?
    A:abstract final class HI{}
    B:abstract private move(){}
    C:protected private number;
    D:public abstract class Car

  3. 数学表达式|x|<10 对应的java表达式为 ?
    A:|x|<10
    B:x<10&&x>-10
    C:x<10||x>-10
    D:10>x>-10

  4. 设int x=1,float y=2,则表达式x/y的值是 ?
    A:0
    B:1
    C:2
    D:以上都不是

  5. 关于以下application,说法正确是什么 ?
    A:4行与9行不能通过编译,因为缺少方法名和返回类型
    B:编译通过,执行结果是:x=5
    C:编译通过,执行结果是:x=3

#include <iostream> #include <vector> #include <algorithm> using namespace std; struct Node { int left, right, cnt; Node() : left(-1), right(-1), cnt(0) {} }; vector<Node> tree; vector<int> roots; int get_cnt(int node) { return (node == -1) ? 0 : tree[node].cnt; } int build(int l, int r) { int node = tree.size(); tree.emplace_back(); if (l == r) { tree[node].left = -1; tree[node].right = -1; tree[node].cnt = 0; return node; } int mid = (l + r) / 2; int left_child = build(l, mid); int right_child = build(mid + 1, r); tree[node].left = left_child; tree[node].right = right_child; tree[node].cnt = get_cnt(left_child) + get_cnt(right_child); return node; } int update(int prev, int l, int r, int val) { int node = tree.size(); tree.push_back({}); // 新建一个空节点 tree[node] = tree[prev]; // 复制父节点内容 if (l == r) { tree[node].cnt++; return node; } int mid = (l + r) / 2; if (val <= mid) { int new_left = update(tree[prev].left, l, mid, val); tree[node].left = new_left; // 只更新左子树 } else { int new_right = update(tree[prev].right, mid + 1, r, val); tree[node].right = new_right; // 只更新右子树 } tree[node].cnt = get_cnt(tree[node].left) + get_cnt(tree[node].right); return node; } int query(int node_l, int node_r, int l, int r, int x) { if (node_r == -1) return 0; if (r <= x) { return get_cnt(node_r) - get_cnt(node_l); } int mid = (l + r) / 2; int res = 0; res += query(tree[node_l].left, tree[node_r].left, l, mid, x); if (x > mid) { res += query(tree[node_l].right, tree[node_r].right, mid + 1, r, x); } return res; } vector<int> discretize(const vector<int>& a) { vector<int> b = a; sort(b.begin(), b.end()); b.erase(unique(b.begin(), b.end()), b.end()); vector<int> res(a.size()); for (int i = 0; i < a.size(); ++i) { res[i] = lower_bound(b.begin(), b.end(), a[i]) - b.begin() + 1; } return res; } int get_max_disc(const vector<int>& a, int target, const vector<int>& disc) { if (target <= *min_element(a.begin(), a.end())) return 0; vector<int> less_vals; for (int val : a) if (val < target) less_vals.push_back(val); int max_less = *max_element(less_vals.begin(), less_vals.end()); for (int i = 0; i < a.size(); ++i) if (a[i] == max_less) return disc[i]; return 0; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; cin >> T; while (T--) { int n; cin >> n; vector<int> a(n); for (int i = 0; i < n; ++i) cin >> a[i]; if (n == 0) { cout << 0 << '\n'; continue; } vector<int> disc = discretize(a); int m = *max_element(disc.begin(), disc.end()); tree.clear(); roots.clear(); roots.push_back(build(1, m)); for (int d : disc) { roots.push_back(update(roots.back(), 1, m, d)); } int max_len = 1; for (int l = 0; l < n; ++l) { for (int r = l + 1; r < n; ++r) { int min_val = min(a[l], a[r]); int left = l + 1; int right = r - 1; int cnt = 0; if (left <= right) { int max_disc_val = get_max_disc(a, min_val, disc); cnt = query(roots[left], roots[right + 1], 1, m, max_disc_val); } int current_len = cnt + 2; max_len = max(max_len, current_len); } } cout << max_len << '\n'; tree.shrink_to_fit(); roots.shrink_to_fit(); } return 0; } 为我生成java代码
07-19
以下是该 C++ 代码的 Java 等效实现。这段代码实现了一个算法,其核心目的是在给定一个整数数组后,找到一个子数组,使得子数组的两端点值的最小值大于子数组中间的某些值,并统计这些值的数量,从而计算出满足条件的最长子数组长度。 主要实现功能包括: 1. **离散化(discretization)**:将输入的数值映射到较小的整数范围。 2. **可持久化线段树(Persistent Segment Tree)**:用于高效地维护数组的前缀区间信息。 3. **查询函数(query)**:用于查询某个区间内小于某个值的元素数量。 4. **主逻辑**:遍历所有可能的子数组端点,使用线段树查询满足条件的元素数量。 --- ### ✅ Java 实现代码如下: ```java import java.io.*; import java.util.*; public class Main { static class Node { int left, right, cnt; Node() { left = -1; right = -1; cnt = 0; } } static List<Node> tree; static List<Integer> roots; public static int getCnt(int node) { return (node == -1) ? 0 : tree.get(node).cnt; } public static int build(int l, int r) { int node = tree.size(); tree.add(new Node()); if (l == r) { tree.get(node).left = -1; tree.get(node).right = -1; tree.get(node).cnt = 0; return node; } int mid = (l + r) / 2; int leftChild = build(l, mid); int rightChild = build(mid + 1, r); tree.get(node).left = leftChild; tree.get(node).right = rightChild; tree.get(node).cnt = getCnt(leftChild) + getCnt(rightChild); return node; } public static int update(int prev, int l, int r, int val) { int node = tree.size(); tree.add(new Node()); tree.set(node, new Node()); Node prevNode = tree.get(prev); tree.get(node).left = prevNode.left; tree.get(node).right = prevNode.right; tree.get(node).cnt = prevNode.cnt; if (l == r) { tree.get(node).cnt++; return node; } int mid = (l + r) / 2; if (val <= mid) { int newLeft = update(prevNode.left, l, mid, val); tree.get(node).left = newLeft; } else { int newRight = update(prevNode.right, mid + 1, r, val); tree.get(node).right = newRight; } tree.get(node).cnt = getCnt(tree.get(node).left) + getCnt(tree.get(node).right); return node; } public static int query(int nodeL, int nodeR, int l, int r, int x) { if (nodeR == -1) return 0; if (r <= x) { return getCnt(nodeR) - getCnt(nodeL); } int mid = (l + r) / 2; int res = 0; res += query(tree.get(nodeL).left, tree.get(nodeR).left, l, mid, x); if (x > mid) { res += query(tree.get(nodeL).right, tree.get(nodeR).right, mid + 1, r, x); } return res; } public static List<Integer> discretize(List<Integer> a) { List<Integer> b = new ArrayList<>(a); Collections.sort(b); Set<Integer> set = new HashSet<>(b); b.clear(); b.addAll(set); Collections.sort(b); List<Integer> res = new ArrayList<>(); for (int val : a) { int idx = Collections.binarySearch(b, val); res.add(idx + 1); // 1-based index } return res; } public static int getMaxDisc(List<Integer> a, int target, List<Integer> disc) { List<Integer> lessVals = new ArrayList<>(); for (int val : a) { if (val < target) { lessVals.add(val); } } if (lessVals.isEmpty()) return 0; int maxLess = Collections.max(lessVals); for (int i = 0; i < a.size(); i++) { if (a.get(i) == maxLess) return disc.get(i); } return 0; } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int T = Integer.parseInt(br.readLine()); while (T-- > 0) { int n = Integer.parseInt(br.readLine()); List<Integer> a = new ArrayList<>(); String[] line = br.readLine().split(" "); for (int i = 0; i < n; i++) { a.add(Integer.parseInt(line[i])); } if (n == 0) { System.out.println(0); continue; } List<Integer> disc = discretize(a); int m = Collections.max(disc); tree = new ArrayList<>(); roots = new ArrayList<>(); roots.add(build(1, m)); for (int d : disc) { roots.add(update(roots.get(roots.size() - 1), 1, m, d)); } int maxLen = 1; for (int l = 0; l < n; l++) { for (int r = l + 1; r < n; r++) { int minVal = Math.min(a.get(l), a.get(r)); int left = l + 1; int right = r - 1; int cnt = 0; if (left <= right) { int maxDiscVal = getMaxDisc(a, minVal, disc); cnt = query(roots.get(left), roots.get(right + 1), 1, m, maxDiscVal); } int currentLen = cnt + 2; maxLen = Math.max(maxLen, currentLen); } } System.out.println(maxLen); } } } ``` --- ### ✅ 代码解释 1. **Node 类**:表示持久化线段树的节点,包含左右子节点索引和当前节点的计数值。 2. **build 函数**:递归构建初始线段树。 3. **update 函数**:创建新节点,复制旧节点内容,并更新受影响的子树。 4. **query 函数**:基于线段树进行区间查询,统计小于某个离散化值的元素数量。 5. **discretize 函数**:对输入数组进行离散化处理,将大范围的数值映射到小范围。 6. **getMaxDisc 函数**:查找小于某个值的最大元素对应的离散化值。 7. **主函数 main**:读取输入、构建持久化线段树、遍历所有可能的子数组端点,查询满足条件的元素数量,最终输出满足条件的最长子数组长度。 --- ### ✅ 注意事项 - Java 中没有 `vector`,使用 `ArrayList` 代替。 - Java 中 `map` 和 `set` 用 `Collections.sort` 和 `HashSet` 实现。 - Java 中 `lower_bound` 用 `Collections.binarySearch` 实现。 - Java 中输入输出使用 `BufferedReader` 和 `System.out.println`。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码的余温

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值