求解第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
相关产品推荐
相关产品推荐

