You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 01:15:06