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

求解第N个monotonic number(单调数),禁用数组与字符串

找到第N个单调数的实现方案

一、单调数检查核心逻辑

题目禁止使用数组或String,我们通过整数取模与除法遍历数位,同时判断数位是否符合递增/递减(含非严格)规则:

检查函数实现

static boolean isMonotonic(int num) {
    // 单数字、双数字直接判定为单调数
    if (num < 100) {
        return true;
    }

    // 初始化最后两位数位
    int prevDigit = num % 10;
    num /= 10;
    int currDigit = num % 10;

    // 标记趋势:1=从左到右非递减,-1=从左到右非递增,0=暂未确定(全相等)
    int trend = 0;
    if (currDigit < prevDigit) {
        trend = 1;
    } else if (currDigit > prevDigit) {
        trend = -1;
    }

    num /= 10;
    // 遍历剩余数位
    while (num > 0) {
        prevDigit = currDigit;
        currDigit = num % 10;
        num /= 10;

        int currentDiff = Integer.compare(currDigit, prevDigit);
        if (trend == 0) {
            // 之前数位全相等,现在确定趋势
            if (currentDiff != 0) {
                trend = currentDiff;
            }
        } else {
            // 检查当前数位对是否符合趋势(允许相等,即非严格单调)
            if (currentDiff != trend && currentDiff != 0) {
                return false;
            }
        }
    }
    return true;
}

逻辑说明

  • 单/双数字直接返回true,完全符合题目要求;
  • 通过%10取个位、/10移除个位的方式从右往左遍历数位,和你现有代码的数位遍历逻辑一致;
  • 先通过最后两位确定单调趋势,后续所有数位对必须匹配该趋势(允许相等,支持非严格单调数如1122、555);
  • 若中途出现不符合趋势的数位组合,直接判定为非单调数。

二、找到第N个单调数的主逻辑

从数字0开始逐个检查,计数符合条件的数,直到找到第N个(索引从0开始):

static int findNthMonotonicNumber(int targetIndex) {
    if (targetIndex < 0) {
        return -1; // 处理非法输入,可根据需求调整
    }

    int count = 0;
    int currentNum = 0;
    while (true) {
        if (isMonotonic(currentNum)) {
            if (count == targetIndex) {
                return currentNum;
            }
            count++;
        }
        currentNum++;
    }
}

三、与你现有代码的结合说明

你当前的functionForCountNumbers仅做数位计数,只需在遍历数位的过程中加入上述趋势判断逻辑,就能完成单调数的校验。比如把计数操作替换为趋势检查,即可判断当前数是否符合要求。

内容的提问来源于stack exchange,提问作者vegaLDN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:55:16