题目链接:
T1:1523. 在区间范围内统计奇数数目
T2:1491. 去掉最低工资和最高工资后的工资平均值
🍀基本数据类型
T1:在区间范围内统计奇数数目
📚题目详情
给你两个非负整数 low 和 high 。请你返回 low 和 high 之间(包括二者)奇数的数目。
示例 1:
输入:low = 3, high = 7
输出:3
解释:3 到 7 之间奇数数字为 [3,5,7] 。
示例 2:
输入:low = 8, high = 10
输出:1
解释:8 到 10 之间奇数数字为 [9] 。
提示:
0 <= low <= high <= 10^9
💡解题思路
方法:前缀和思想
思路与算法
如果我们暴力枚举 [low,high] 中的所有元素会超出时间限制。
class Solution {
public int countOdds(int low, int high) {
int sum=0;
for(int i=low;i<=high;i++){
if(i%2!=0){
sum++;
}
}
return sum;
}
}
我们可以使用前缀和思想来解决这个问题,定义pre(x) 为区间 [0,x] 中奇数的个数,很显然:
故答案为pre(high)−pre(low−1)
。
🔑源代码
class Solution {
public int countOdds(int low, int high) {
return pre(high)-pre(low-1);
}
public int pre(int x){
return (x+1) >> 1;//利用位运算,相当于(x+1)/2的整形
}
}
T2:去掉最低工资和最高工资后的工资平均值
📚题目详情
给你一个整数数组 salary ,数组里每个数都是 唯一 的,其中 salary[i] 是第 i 个员工的工资。请你返回去掉最低工资和最高工资以后,剩下员工工资的平均值。
示例 1:
输入:salary = [4000,3000,1000,2000]
输出:2500.00000
解释:最低工资和最高工资分别是 1000 和 4000 。
去掉最低工资和最高工资以后的平均工资是 (2000+3000)/2= 2500
示例 2:
输入:salary = [1000,2000,3000]
输出:2000.00000
解释:最低工资和最高工资分别是 1000 和 3000 。
去掉最低工资和最高工资以后的平均工资是 (2000)/1= 2000
示例 3:
输入:salary = [6000,5000,4000,3000,2000,1000]
输出:3500.00000
示例 4:
输入:salary = [8000,9000,2000,3000,6000,1000]
输出:4750.00000
提示:
3 <= salary.length <= 100
10^3 <= salary[i] <= 10^6
salary[i] 是唯一的。
与真实值误差在 10^-5 以内的结果都将视为正确答案。
💡解题思路
先对数组salary进行从小到大排序,可以直接利用Arrays类的sort方法,去掉最小值和最大值即将第一个元素和最后一个元素直接的元素相加,再除以数组长度减2。
🔑源代码
class Solution {
public double average(int[] salary) {
Arrays.sort(salary);
double sum=0;
for(int i=1;i<salary.length-1;i++){
sum += salary[i];
}
return sum/(salary.length-2);
}
}