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。

详细描述执行过程:

  1. 1.函数入口与变量初始化
    函数validDigit接收两个参数:整数n(待判断的数字)和整数x(目标数字)。
    内部定义布尔变量hasX并初始化为false,它将用于标记在最高位的其它十进制位中是否至少出现过一次数字x

  2. 2.剥离低位数字的循环
    进入for循环,循环条件是n >= 10。这一条件保证循环只处理仍有至少两位数字的情况,也就是每次都能剥离出当前的最低位,且剥离后剩下的部分至少还有一位(最终会成为最高位)。
    在每一次循环中:

  • • 计算n % 10,得到当前n最低位数字

  • • 将该低位数字与x比较:如果相等,就把hasX置为true。这意味着在非最高位中发现了一次目标数字。

  • • 执行n /= 10,丢弃已检查的最低位,把剩下的高位部分作为新的n,继续下一轮判断。
    这个循环不断“从右向左”扫描十进制位,直到剩余部分只剩下最高位一位数字(即n < 10)为止。

3.处理最高位并返回结果
循环结束时,变量n已经变成了原整数最高位的那一个数字(例如对于101,最终n = 1)。
此时,hasX已经记录了除最高位外是否出现过x
函数最后的返回语句是:

return hasX && n != x
它同时检查两个条件:
  • hasXtrue:表示在非最高位中,至少出现了一次数字x

  • n != x:表示最高位数字不等于x
    仅当两个条件都满足时,才认为n是“有效”的,返回true;否则返回false

4.具体示例的执行轨迹(n = 101, x = 0)

  • • 初始:n = 101hasX = false

  • • 第一次循环:n >= 10成立,n % 10 = 1≠ 0,hasX保持false;然后n = 101 / 10 = 10

  • • 第二次循环:n >= 10成立,n % 10 = 0==xhasX变为true;然后n = 10 / 10 = 1

  • • 循环条件检查:此时n = 1,不满足n >= 10,循环终止。

  • • 返回:hasXtruen (1) != x (0)成立,结果为true。这与题目解释一致。

5.边界情况覆盖

  • • 如果n是一位数(0~9),循环不会执行,hasX保持false,最终返回false。这符合题意,因为一位数要么没有其它位出现x,要么本身既是最高位又是唯一出现x的位(最高位等于x),必然不满足两个条件。

  • • 如果x只出现在最高位(例如n = 101, x = 1),那么循环中hasXfalse(其它位没有 1),最终返回false,符合“最高位不是 x”的要求。

  • • 如果n = 0, x = 0,循环不执行,hasXfalsen为 0,返回false,也正确,因为最高位是 0 且没有其它位出现 0。

时间复杂度分析
循环的执行次数等于整数n的十进制位数减 1(即去掉最高位后的位数)。设n的位数为dd = ⌊log₁₀ n⌋ + 1n > 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++完整代码如下:

  

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;
}
打开网易新闻 查看精彩图片

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。