Java中如何高效排除百位为5及是3的倍数的数字
Java过滤指定数字的高效实现方案
首先直接给结论:转字符串的方案可以实现需求,但还有更简洁高效的纯数值运算方案,比你目前的循环区间判断性能高几个量级。
原有实现的问题
你目前写的区间循环判断存在两个明显缺陷:
- 仅能覆盖500599的区间,要覆盖110000内所有百位为5的数,还需要额外写15001599、25002599等共9段区间的判断逻辑,代码冗余度极高
- 每次判断单个数字最多要执行100次比较操作,全量1万条数据最多要执行100万次比较,性能损耗非常大
可选方案对比
1. 字符串转换方案
该方案可以实现需求,不需要写多段区间判断,示例逻辑如下:
// 先补前导零统一长度,避免不足三位时索引报错 String numStr = String.format("%04d", a); if (numStr.charAt(2) == '5') { return false; }
优缺点:逻辑直观好理解,但每次判断需要做字符串格式化、对象创建、字符索引操作,开销高于纯数值运算,仅适合小数据量场景。
2. 算术运算方案(最优推荐)
百位的数值可以直接通过算术运算提取,不需要转换类型,也不需要循环,一行代码即可实现,提取公式为:(a / 100) % 10 == 5
逻辑说明:
- 先把数字除以100做整数运算,直接抹掉最后两位,例如
567 / 100 = 5、1523 / 100 = 15、9599 / 100 = 95 - 再对10取余,即可直接得到百位的数值,等于5就满足排除条件
完整实现代码
结合排除3的倍数的需求,完整的过滤逻辑如下:
import java.util.ArrayList; import java.util.List; public class NumberFilter { public static void main(String[] args) { List<Integer> validNumbers = new ArrayList<>(); // 遍历1到10000的所有数字 for (int a = 1; a <= 10000; a++) { // 满足任意一个排除条件就跳过 if (a % 3 == 0 || (a / 100) % 10 == 5) { continue; } validNumbers.add(a); } } }
该方案每个数字仅需要2次算术运算+2次比较,1万条数据仅需要几万次操作,性能远高于前两种方案,且代码简洁无冗余。
内容的提问来源于stack exchange,提问作者JpG099
相关产品推荐
相关产品推荐

