Leetcode_12 天编程能力入门_day1

感觉题目不够做,再开启一个学习计划吧~

1523. Count Odd Numbers in an Interval Range

Analysis

找出 $[low, high]$ 内的奇数。

Code

这题也太容易了吧?

1
2
3
4
5
6
7
8
9
10
class 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
7
class 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
6
class 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
6
class 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
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
double average(vector<int>& salary) {
int size = salary.size(), sum = salary[0], min = salary[0], max = salary[0];
for(int i = 1; i < size; i++) {
sum += salary[i];
if(min > salary[i]) min = salary[i];
if(max < salary[i]) max = salary[i];
}
return (sum - min - max) * 1.0 / (size - 2);
}
};

Summary

虽然是简单题,但是如何把简单题做的更简单也需要多动脑筋。其实第二个题,可以直接调用 API,但是直接一个循环解决会更好。


Buy me a coffee ? :)
0%