1523. 在区间范围内统计奇数数目(1)

问题描述1:

1523. 在区间范围内统计奇数数目(1)_第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]的奇数,最后做差.

1523. 在区间范围内统计奇数数目(1)_第2张图片

题外话:
举例子:
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)

若有理解错误后台留言,谢谢

你可能感兴趣的:(力扣刷题,#,编程基础能力,python,c++,算法,leetcode)