2026-08-04:有效数字整数。用go语言,给定一个整数 n 和一个数字 x。当 n 的十进制表示中至少出现一次 x,并且最高位不是 x 时,称 n 是有效

0 阅读4分钟

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

  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++完整代码如下:

#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;
}

在这里插入图片描述