牛客网:好数问题详解

牛客网:好数问题详解

题目要求

在这里插入图片描述

题号:NC216068

判断一个数是否为"好数"。好数的定义:若一个数的首位和末位相等,则定义这个数为"好数"。

例如:

  • 1231、4512394是好数(首位和末位都相等)
  • 12345、768740不是好数(首位和末位不相等)

解题思路

要判断一个数是否为好数,我们需要提取这个数的首位和末位,然后判断它们是否相等。

  1. 提取末位:一个数的末位是个位数,可以通过对10取余(x % 10)获得。
  2. 提取首位:我们可以不断除以10直到数字小于10,此时剩下的就是首位。

代码实现

bool judge(int x) {
    // 获取末位数字
    int a = x % 10;
    
    // 不断除以10,直到获取首位数字
    while(x >= 10)
        x /= 10;
    
    // 判断首位和末位是否相等
    return x == a;
}

代码分析

  1. int a = x % 10; - 通过对10取余,获取原数字的末位。例如,1231 % 10 = 1,这样就得到了末位1。

  2. while(x >= 10) x /= 10; - 这个循环会持续将数字除以10,直到数字小于10为止。

    • 例如,对于1231:
      • 第一次:1231 / 10 = 123
      • 第二次:123 / 10 = 12
      • 第三次:12 / 10 = 1
    • 此时x = 1,小于10,跳出循环,我们成功获取了首位数字1。
  3. return x == a; - 比较首位和末位是否相等,如果相等返回true(是好数),否则返回false(不是好数)。

复杂度分析

  • 时间复杂度:O(log n),其中n是输入的数字。因为我们需要不断地除以10,直到得到首位,这个过程的复杂度与数字的位数成正比,而数字的位数是log₁₀n。
  • 空间复杂度:O(1),只使用了常数级别的额外空间。

测试用例分析

  1. 输入:1231

    • 末位:1231 % 10 = 1
    • 循环除以10:1231 -> 123 -> 12 -> 1
    • 首位:1
    • 1 == 1,返回true
  2. 输入:4

    • 末位:4 % 10 = 4
    • 由于4 < 10,不进入循环
    • 首位就是4本身
    • 4 == 4,返回true
  3. 输入:100

    • 末位:100 % 10 = 0
    • 循环除以10:100 -> 10 -> 1
    • 首位:1
    • 1 != 0,返回false

小技巧

这类问题也可以通过转换为字符串来解决,但用数学方法处理通常更高效,尤其是在处理大数字时。

如果考虑转换为字符串的方法,可以这样实现:

bool judge(int x) {
    string s = to_string(x);
    return s[0] == s[s.length() - 1];
}

但数学方法更为直接,效率也更高。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值