完美整数 | 豆包MarsCode AI刷题

61 阅读4分钟
public static int solution(int x, int y) {
    // Edit your code here
    int i = 0;
    int temp = 0;
    int num = y - x + 1;
    for(i = x; i<=y; i++)
    {
        int temp1 = i;
        while(temp1!=0)
        {            
            temp = temp1%10;
            //System.out.println(temp);
            temp1 = temp1/10;
            //System.out.println(temp1+" "+"111");
            if(temp1 != 0 && temp != temp1%10){num = num - 1; break;}
        }
    }
    return num;
}

这段代码的作用是计算在给定范围 [x, y] 内的数字个数,这些数字满足某种条件。具体来说,代码检查这些数字是否包含了至少两个不同的数字。如果一个数字的每一位都与其他位的数字相同(例如 111、2222 等),则该数字会被排除在结果之外。 代码逐行解释:

  1. int i = 0;
    初始化变量 i 用作循环计数器。

  2. int temp = 0;
    初始化变量 temp,用于存储数字的当前位。

  3. int num = y - x + 1;
    计算范围内数字的初始计数(包含 xy)并赋值给 num

  4. for(i = x; i<=y; i++)
    开始一个循环,遍历从 xy 的所有整数。

  5. int temp1 = i;
    将当前循环的数字 i 赋值给 temp1,用于后续的操作。

  6. while(temp1!=0)
    temp1 不为零时,继续循环,用以检查数字的每一位。

  7. temp = temp1%10;
    temp1 的最右边一位数字,存储到 temp

  8. temp1 = temp1/10;
    temp1 除以 10,去掉最右边的数字,准备处理下一位。

  9. if(temp1 != 0 && temp != temp1%10){num = num - 1; break;}
    检查 temp1 是否不为零且 temp(之前保存的数字)与 temp1 的最右边数字是否不同。如果不同,说明这个数字有不同的位,减少计数 num 并跳出当前数字的检查。

  10. }
    结束内层 while 循环。

  11. }
    结束外层 for 循环。

  12. return num;
    返回满足条件的数字数量 num。 总结:

  • 代码旨在计算 xy 之间的数字中,具有至少两个不同数字的数字数量。
  • 例如,在范围 111 到 119 之间,只有 111 是不符合条件的(因为它的所有位都相同),所以结果应该是 9。 这段代码的目的是计算给定范围 [x, y] 内的整数中,所有具有不同相邻数字的整数的数量。具体来说,代码遍历区间内的所有整数,检查每个整数的数字是否与其相邻的数字不同,若有相邻数字相同,则从结果中减去该整数。下面是对代码的逐步解析和解释。

代码解析

  1. 初始化变量

    int num = y - x + 1; // 计算给定区间的总数
    
    • num 初始化为 y - x + 1,表示范围内所有整数的总数。
  2. 遍历区间内的整数

    for(i = x; i <= y; i++) {
    
    • 通过 for 循环遍历从 xy 的每个整数 i
  3. 检查每个整数的数字

    int temp1 = i;
    while(temp1 != 0) {
        temp = temp1 % 10; // 获取当前数的最后一位
        temp1 = temp1 / 10; // 去掉最后一位
    
    • 使用 while 循环来逐位检查当前整数 i 的每一位数字。
    • temp 存储当前最末尾的数字,temp1 则逐渐减少,直到变为0。
  4. 比较相邻数字

    if(temp1 != 0 && temp != temp1 % 10) {
        num = num - 1; 
        break;
    }
    
    • 在每次迭代中,代码比较当前数字和新的数字。
    • 如果 temp1 不为0(意味着仍然有数字未检查)并且当前数字 temp 与新的最后一位数字不等,则说明找到了相邻相同的数字,此时将 num 减1,并 break 退出当前 while 循环,继续检查下一个整数。
  5. 返回结果

    return num;
    
    • 函数返回在 [x, y] 范围内不具有相邻相同数字的整数数量。

整体特殊情况

  • 该代码逻辑流水线简单,通过对每个数字的逐位检测来判断是否有相邻同位数字。
  • 比如,对于 121,由于存在相邻数字 12 不同,因此 121 被认为是有效的;而 112 则会被减去,因为有相邻数字相同。

复杂度分析

  • 时间复杂度:O(n * d),其中 n 是从 xy 的范围内的数字个数,d 是每个数字的位数。虽然理论上最坏情况可能较高,但在实际的输入范围上通常是可以接受的。
  • 空间复杂度:O(1),因为除了常数变量之外,没有使用额外空间。

总结

该算法有效地检查范围内的每个数字,通过逐位比较判断相邻数字的相同性,从而统计有效的数字个数。虽然实现上使用了较为直接的方式,但在处理大范围输入时,可能会遇到性能瓶颈。针对大规模数据时,可以考虑其他效率更高的数据结构或算法来提升性能。