Java

Java 编程练习:数组、字符串与集合10

从计算开始,再看问题如何改变需要保留的状态。每道核心练习都包含完整的 Java 解法、输入约束和算法选择的依据。

数组与数值范围

先应用符号并对应下标,再选择 int 或 long。接着学习乘积超出 int 范围的数列。

  1. 使用 IntStream 对 Java 中带符号的数值求和

    用 IntStream 组合绝对值与对应的布尔符号,检查正负抵消、全负输入、int 范围以及数组等长的约定。

  2. Java 数组点积:IntStream 与整数范围

    使用 IntStream 将两个数组对应元素相乘后求和,理解符号、int 范围,以及为何必须在乘法溢出前提升操作数类型。

  3. Java 等差数列:乘法前先提升类型

    使用 IntStream 生成从 x 到 x*n 的 n 个值,说明为什么仅用 mapToLong 不能避免 int 溢出,并检查正、负和零步长。

字符串与有序转换

对数字单词使用字面量替换,保持规范化顺序,再用栈删除相邻的相同字符对。

  1. 用 Java String.replace 转换英文数字单词

    通过字面量替换规范化数字与 zero 到 nine 单词的有效混合输入,区分 replace 与 replaceAll,并说明整数范围和适用条件。

  2. Java 新 ID 推荐:规范化顺序与截断

    用 Optional 链和循环实现 ID 规范化,检查连续点合并、过滤后的空值、截断后清理、补齐和区域设置独立性。

  3. 用 Java ArrayDeque 栈删除相邻重复字符对

    用栈消除相邻相同字符对,说明前缀不变式、连锁删除、百万字符边界及时间和空间开销。

计数、状态与排序

区分姓名出现次数和不同类型的数量,再跟踪缓存的最近使用顺序,按比例排序并明确同分规则。

  1. Java 用姓名频次找出未完成比赛的选手

    使用 HashMap 将完赛频次从参赛频次中扣除,处理重名,说明为什么不能用 Set 差集及只有一名未完赛者的条件。

  2. Java Ponketmon:为什么答案是 min(不同种类数, N/2)

    用 HashSet 统计不同种类,并证明选择上限可达。区分计算最大种类数与构造具体选择。

  3. Java LRU 缓存:使用 LinkedHashMap 的访问顺序

    用按访问顺序排列的 LinkedHashMap 模拟 LRU,检查命中刷新、淘汰、忽略大小写的键、零容量与成本模型的假设。

  4. Java 失败率排序:分母、并列与 long 交叉乘积

    统计停留和到达人数,用 long 交叉乘积精确比较失败率,处理无人到达、全部通关和关卡编号的并列规则。