力扣热题——统计对称整数的数目
目录
题目链接: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 <=
解法一:随便写写
主函数
- 遍历范围:从
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; }};
运行时间
时间复杂度和空间复杂度
- 总时间复杂度:
- 最坏情况下为
O((high - low + 1) * log(high))
。
- 最坏情况下为
总结
这题太EZ乐,不用总结了谢谢