> 技术文档 > 力扣热题——统计对称整数的数目

力扣热题——统计对称整数的数目

目录

题目链接:2843. 统计对称整数的数目 - 力扣(LeetCode)

题目描述

解法一:随便写写

(1) 数字拆解

(2) 判断位数是否为偶数

(3) 分割数字并计算和

(4) 比较两部分之和

​编辑

Java写法:

C++写法:

运行时间

时间复杂度和空间复杂度

总结


题目链接:2843. 统计对称整数的数目 - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

题目描述

给你两个正整数 low 和 high 。

对于一个由 2 * n 位数字组成的整数 x ,如果其前 n 位数字之和与后 n 位数字之和相等,则认为这个数字是一个对称整数。

返回在 [low, high] 范围内的 对称整数的数目 。

示例 1:

输入:low = 1, high = 100输出:9解释:在 1 到 100 范围内共有 9 个对称整数:11、22、33、44、55、66、77、88 和 99 。

示例 2:

输入:low = 1200, high = 1230输出:4解释:在 1200 到 1230 范围内共有 4 个对称整数:1203、1212、1221 和 1230 。

提示:

  • 1 <= low <= high <= 10^4

解法一:随便写写

主函数

  • 遍历范围:从 low 到 high,逐个检查每个数字。
  • 调用辅助函数:通过 isRight(i) 判断当前数字是否为对称整数。
  • 计数器更新:如果当前数字是有效对称整数,则将计数器 res 增加 1。

辅助函数

(1) 数字拆解
  • 使用 while (num > 0) 循环,将数字的每一位提取出来并存入 ArrayList
  • 同时记录数字的总位数 len
(2) 判断位数是否为偶数
  • 如果数字的位数 len 是奇数,直接返回 false,因为只有偶数位的数字才可能是对称整数。
(3) 分割数字并计算和
  • 将数字分为两部分:
    • 前半部分:索引范围 [0, len/2 - 1]
    • 后半部分:索引范围 [len/2, len - 1]
  • 使用循环计算前半部分和后半部分的数字之和,分别存储在 res1 和 res2 中。
(4) 比较两部分之和
  • 如果 res1 == res2,则说明该数字是对称整数,返回 true;否则返回 false

Java写法:

class Solution { public int countSymmetricIntegers(int low, int high) { int res = 0; for(int i = low;i <= high;i++){ if(isRight(i)){ res++; } } return res; } private boolean isRight(int num){ // 由于固定是一个2n长度的数字,所以直接一半一半的判断就好了 int len = 0; ArrayList list = new ArrayList(); while(num > 0){ list.add(num % 10); num = num / 10; len++; } if(len % 2 != 0){ return false; } int res1 = 0; int res2 = 0; for(int i = 0;i < len;i++){ // 0 1 2 3 // if(i + 1 <= (len + 1) / 2){ res1 += list.get(i); }else{ res2 += list.get(i); } } //System.out.println(res1 + \":\" + res2); return res1 == res2; }}

C++写法:

#include  // 用于 log10 函数class Solution {public: int countSymmetricIntegers(int low, int high) { int res = 0; for (int i = low; i <= high; ++i) { if (isSymmetric(i)) { ++res; } } return res; }private: bool isSymmetric(int num) { // 计算数字的位数 int len = static_cast(log10(num)) + 1; if (len % 2 != 0) { return false; // 位数为奇数,直接返回 false } int half = len / 2; int sum1 = 0, sum2 = 0; // 计算前半部分和后半部分的和 for (int i = 0; i < len; ++i) { int digit = num % 10; // 获取当前最低位 num /= 10;  // 去掉最低位 if (i < half) { sum2 += digit; // 后半部分 } else { sum1 += digit; // 前半部分 } } return sum1 == sum2; }};

运行时间

时间复杂度和空间复杂度

  1. 总时间复杂度
    • 最坏情况下为 O((high - low + 1) * log(high))



总结

        这题太EZ乐,不用总结了谢谢