问题描述1:
1.首先0到8之间有5偶4奇。
2.最大数和最小数都是偶数时,奇数个数:sum = (high - low)/2; 其他情况都是(high - low)/2 + 1取下界;
3.【0,x】之间奇数为(x+1)/2 取下界
所以这里可以这样计算x->y之间的奇数=》先计算完[0,x-1] (保留数字x的存在) 之间的奇数,然后计算[0,y]的奇数,最后做差.
题外话:
举例子:
1. x=6(0110)>>(0011)=3
2. 6+1=7(0111)>>(0011)=3
3. (1,3,5)刚好3个奇数====》所以【0,奇数】有几个奇数,下一位数字也几个奇数(5/6、7/8…奇数是一样)
4. 就是x为奇数时,例如5,不够进位,加一位后方可除2,为奇数个数,偶数的话加一之后移位对结果没有影响
右移1位表示数字降一倍,左移1位增加1倍(偶数,奇数近似)
c++编程
class Solution {
public:
int odd(int x){
return (x+1)>>1;
}
int countOdds(int low, int high) {
return odd(high)-odd(low-1);
}
};
python3编程
class Solution:
def countOdds(self, low: int, high: int) -> int:
odd=lambda x: (x + 1) >> 1 #匿名函数
return odd(high)-odd(low-1)
问题描述2:1491. 去掉最低工资和最高工资后的工资平均值
vector < int > &A ;意味着vector是一个向量(或int型的容器),引用A
提示:int ints[] = { 3,5,7,2,7,6,4 };
//方法一
cout << “方法一最大值地址是” << max_element(ints, ints + 7, structs) << endl;
cout << “方法一最大值的值是” << *max_element(ints, ints + 7, structs ) << endl;
//方法二
cout << “方法二最大值地址是” << max_element(ints, ints + 7) << endl;
cout << “方法二最大值的值是” << *max_element(ints, ints + 7) << endl;
//如果不加 ‘ * ’获取的是他的地址,求数列的最小值为min_element()。同理
int sum = accumulate(vec.begin() , vec.end() , 42);
accumulate 带有三个形参:头两个形参指定要累加的元素范围,第三个形参则是累加的初值
c++编程
class Solution {
public:
double average(vector<int>& salary) {
double tall = *max_element(salary.begin(), salary.end());
double small = *min_element(salary.begin(), salary.end());
double sum = accumulate(salary.begin(), salary.end(),-tall-small);
return sum/(salary.size()-2);
}
};
python3编程
class Solution:
def average(self, salary: List[int]) -> float:
tall=max(salary)
small=min(salary)
sum1=sum(salary)-tall-small
return sum1/(len(salary)-2)