Java 编程练习:数组、字符串与集合10
从计算开始,再看问题如何改变需要保留的状态。每道核心练习都包含完整的 Java 解法、输入约束和算法选择的依据。
数组与数值范围
先应用符号并对应下标,再选择 int 或 long。接着学习乘积超出 int 范围的数列。
- 使用 IntStream 对 Java 中带符号的数值求和
用 IntStream 组合绝对值与对应的布尔符号,检查正负抵消、全负输入、int 范围以及数组等长的约定。
- Java 数组点积:IntStream 与整数范围
使用 IntStream 将两个数组对应元素相乘后求和,理解符号、int 范围,以及为何必须在乘法溢出前提升操作数类型。
- Java 等差数列:乘法前先提升类型
使用 IntStream 生成从 x 到 x*n 的 n 个值,说明为什么仅用 mapToLong 不能避免 int 溢出,并检查正、负和零步长。
字符串与有序转换
对数字单词使用字面量替换,保持规范化顺序,再用栈删除相邻的相同字符对。
- 用 Java String.replace 转换英文数字单词
通过字面量替换规范化数字与 zero 到 nine 单词的有效混合输入,区分 replace 与 replaceAll,并说明整数范围和适用条件。
- Java 新 ID 推荐:规范化顺序与截断
用 Optional 链和循环实现 ID 规范化,检查连续点合并、过滤后的空值、截断后清理、补齐和区域设置独立性。
- 用 Java ArrayDeque 栈删除相邻重复字符对
用栈消除相邻相同字符对,说明前缀不变式、连锁删除、百万字符边界及时间和空间开销。
计数、状态与排序
区分姓名出现次数和不同类型的数量,再跟踪缓存的最近使用顺序,按比例排序并明确同分规则。
- Java 用姓名频次找出未完成比赛的选手
使用 HashMap 将完赛频次从参赛频次中扣除,处理重名,说明为什么不能用 Set 差集及只有一名未完赛者的条件。
- Java Ponketmon:为什么答案是 min(不同种类数, N/2)
用 HashSet 统计不同种类,并证明选择上限可达。区分计算最大种类数与构造具体选择。
- Java LRU 缓存:使用 LinkedHashMap 的访问顺序
用按访问顺序排列的 LinkedHashMap 模拟 LRU,检查命中刷新、淘汰、忽略大小写的键、零容量与成本模型的假设。
- Java 失败率排序:分母、并列与 long 交叉乘积
统计停留和到达人数,用 long 交叉乘积精确比较失败率,处理无人到达、全部通关和关卡编号的并列规则。