没抵挡住诱惑转c++了,以后的题都用c++写…
1523 在区间范围内统计奇数
给你两个非负整数 low
和 high
。请你返回 low
和 high
之间(包括二者)奇数的数目。
题目链接
是简单题,一行代码
class Solution {
class Solution {
public:
int countOdds(int low, int high) {
return ((high >> 1) + (high & 1)) - (low >> 1);
}
};
一些关于位运算速度的小问题
在优化的时候我有想过,位运算在乘除以及取余运算中是否比直接写乘除快呢?依稀记得这个问题老师当初上课的时候也提问过,但是我不记得答案了,也没有自己做过实验。先占一个坑。以后有空再回来回答。
1491 去掉最低工资和最高工资后的平均工资
给你一个整数数组 salary ,数组里每个数都是 唯一 的,其中 salary[i] 是第 i 个员工的工资。
请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。
注意
- 3 ⩽ s a l a r y . l e n g t h ⩽ 100 3 \leqslant salary.length \leqslant 100 3⩽salary.length⩽100
- 1 0 3 ⩽ s a l a r y [ i ] ⩽ 1 0 6 10^3 \leqslant salary[i] \leqslant 10^6 103⩽salary[i]⩽106
- s a l a r y [ i ] salary[i] salary[i] 是唯一的。
- 与真实值误差在 1 0 − 5 10^{-5} 10−5 以内的结果都将视为正确答案。
题目链接
不使用排序,是因为排序最快也要
O
(
n
l
o
g
n
)
O(nlog_n)
O(nlogn)。直接遍历。
class Solution {
public:
double average(vector<int>& salary) {
int len = salary.size();
double max = salary[0];
double min = salary[0];
double sum = 0;
for(int i = 0; i < len; i++)
{
sum += salary[i];
max = max > salary[i] ? max : salary[i];
min = min < salary[i] ? min : salary[i];
}
sum = sum - min - max;
return sum / (len - 2);
}
注意
- 数据类型和范围. 以下摘自《c primer plus(第六版)中文版》
double类型和float类型的最小取值范围相同,但至少必须能表示10位有效数字。一般情况下,double占用64位而不是32位。一些系统将多出的32位全部来表示非指数部分。这不仅增加了有效数字的位数(即提高了精度),而且减少了舍入误差。另一些系统把其中的一些位分配给指数部分,以容纳更大的指数,从而增加了可表示数的范围。无论哪种方法,double类型的值至少有13位有效数字。 超过了标准的最低位数规定。