2026-08-04:有效数字整数。用go语言,给定一个整数 n 和一个数字 x。
当 n 的十进制表示中至少出现一次 x,并且最高位不是 x 时,称 n 是有效的。
请判断 n 是否满足这一条件,满足则返回真,否则返回假。
0 <= n <= 100000。
0 <= x <= 9。
输入: n = 101, x = 0。
输出: true。
解释:
该数字在下标 1 处包含数字 0。它不以 0 开头,因此满足两个条件。所以,答案是 true。
题目来自力扣3908。
详细描述执行过程:
-
函数入口与变量初始化
函数validDigit接收两个参数:整数n(待判断的数字)和整数x(目标数字)。
内部定义布尔变量hasX并初始化为false,它将用于标记在 非最高位 的其它十进制位中是否至少出现过一次数字x。 -
剥离低位数字的循环
进入for循环,循环条件是n >= 10。这一条件保证循环只处理 仍有至少两位数字 的情况,也就是每次都能剥离出当前的最低位,且剥离后剩下的部分至少还有一位(最终会成为最高位)。
在每一次循环中:- 计算
n % 10,得到当前n的 最低位数字。 - 将该低位数字与
x比较:如果相等,就把hasX置为true。这意味着在非最高位中发现了一次目标数字。 - 执行
n /= 10,丢弃已检查的最低位,把剩下的高位部分作为新的n,继续下一轮判断。
这个循环不断“从右向左”扫描十进制位,直到剩余部分只剩下 最高位一位数字(即n < 10)为止。
- 计算
-
处理最高位并返回结果
循环结束时,变量n已经变成了原整数 最高位的那一个数字(例如对于101,最终n = 1)。
此时,hasX已经记录了除最高位外是否出现过x。
函数最后的返回语句是: return hasX && n != x 它同时检查两个条件:hasX为true:表示在非最高位中,至少出现了一次 数字x。n != x:表示 最高位数字不等于x。
仅当两个条件都满足时,才认为n是“有效”的,返回true;否则返回false。
-
具体示例的执行轨迹(n = 101, x = 0)
- 初始:
n = 101,hasX = false。 - 第一次循环:
n >= 10成立,n % 10 = 1≠ 0,hasX保持false;然后n = 101 / 10 = 10。 - 第二次循环:
n >= 10成立,n % 10 = 0==x,hasX变为true;然后n = 10 / 10 = 1。 - 循环条件检查:此时
n = 1,不满足n >= 10,循环终止。 - 返回:
hasX为true且n (1) != x (0)成立,结果为true。这与题目解释一致。
- 初始:
-
边界情况覆盖
- 如果
n是一位数(0~9),循环不会执行,hasX保持false,最终返回false。这符合题意,因为一位数要么没有其它位出现x,要么本身既是最高位又是唯一出现x的位(最高位等于x),必然不满足两个条件。 - 如果
x只出现在最高位(例如n = 101, x = 1),那么循环中hasX为false(其它位没有 1),最终返回false,符合“最高位不是 x”的要求。 - 如果
n = 0, x = 0,循环不执行,hasX为false,n为 0,返回false,也正确,因为最高位是 0 且没有其它位出现 0。
- 如果
时间复杂度分析
循环的执行次数等于整数 n 的十进制位数减 1(即去掉最高位后的位数)。设 n 的位数为 d,d = ⌊log₁₀ n⌋ + 1(n > 0)。循环执行 d - 1 次,时间复杂度为 O(d),也可以表示为 O(log₁₀ n)。
由于题目中 n 最大为 100000(6 位数),实际循环次数不超过 5 次,可以视作常数时间 O(1)。
额外空间复杂度分析
函数内部只使用了固定数量的基础变量(hasX 布尔变量、循环中的临时值),不分配任何与输入规模相关的额外内存。因此,总额外空间复杂度为 O(1)。
Go完整代码如下:
package main
import (
"fmt"
)
func validDigit(n, x int) bool {
hasX := false
for ; n >= 10; n /= 10 {
if n%10 == x {
hasX = true
}
}
return hasX && n != x
}
func main() {
n := 101
x := 0
result := validDigit(n, x)
fmt.Println(result)
}
Python完整代码如下:
# -*-coding:utf-8-*-
def valid_digit(n: int, x: int) -> bool:
has_x = False
while n >= 10:
if n % 10 == x:
has_x = True
n //= 10
return has_x and n != x
def main():
n = 101
x = 0
result = valid_digit(n, x)
print(result)
if __name__ == "__main__":
main()
C++完整代码如下:
#include <iostream>
using namespace std;
bool validDigit(int n, int x) {
bool hasX = false;
while (n >= 10) {
if (n % 10 == x) {
hasX = true;
}
n /= 10;
}
return hasX && (n != x);
}
int main() {
int n = 101;
int x = 0;
bool result = validDigit(n, x);
cout << boolalpha << result << endl;
return 0;
}