1523. Count Odd Numbers in an Interval Range
Analysis
找出 $[low, high]$ 内的奇数。
Code
这题也太容易了吧?1
2
3
4
5
6
7
8
9
10class Solution {
public:
int countOdds(int low, int high) {
int count = 0;
for(; low <= high; low++) {
if(low % 2) count++;
}
return count;
}
};
竟然超时了,判断奇偶还有什么骚操作吗?
仔细想一下,这个题应该是个数学题。自然数中,奇数与偶数都是交替排列的,也就是说,奇数后面的后面的数还是奇数。那么,根据给定数字的不同,不如直接将中间奇数的个数算出来,如下:1
2
3
4
5
6
7class Solution {
public:
int countOdds(int low, int high) {
if(low % 2 && high % 2) return (high - low) / 2 + 1;
else return (high - low) / 2 + high % 2 + low % 2;
}
};
这样写显然不够优雅,改一下:1
2
3
4
5
6class Solution {
public:
int countOdds(int low, int high) {
return (high - low) / 2 + (high % 2 || low % 2);
}
};
嗯,好多了。
实际上,区间 $[0, x]$ 的奇数个数就等于 $\lfloor \frac{x + 1}{2} \rfloor$。那么可以用前缀和思想来处理这个问题,如下:1
2
3
4
5
6class Solution {
public:
int countOdds(int low, int high) {
return ((high + 1) >> 1) - (low >> 1);
}
};
1491. Average Salary Excluding the Minimum and Maximum Salary
Analysis
在计算总薪水的同时,得到最大值和最小值,然后返回结果就可以了。
Code
1 | class Solution { |
Summary
虽然是简单题,但是如何把简单题做的更简单也需要多动脑筋。其实第二个题,可以直接调用 API,但是直接一个循环解决会更好。