一、第一天:基本数据类型
1.1、在区间范围内统计奇数数目
如果我们暴力枚举 [low, high]
中的所有元素会超出时间限制。
class Solution {
public int countOdds(int low, int high) {
int count = 0;
for(int i = low; i <= high;i++){
if( i % 2 == 1){
count++;
}
}
return count;
}
}
我们可以使用 前缀和 思想来解决这个问题,定义 pre(x) 为区间 [0,x]
中奇数的个数,很显然:
[3,7]
= [0,7]
- [0,2]
class Solution {
public int countOdds(int low, int high) {
return pre(high) - pre(low - 1);
}
public int pre(int x) {
return (x + 1) >> 1;
}
}
复杂度分析
- 时间复杂度:O(1)
- 空间复杂度:O(1)
1.2、去掉最低工资和最高工资后的工资平均值
class Solution {
public double average(int[] salary) {
double sum = 0;
double maxValue = Integer.MIN_VALUE, minValue = Integer.MAX_VALUE;
for (int num : salary) {
sum += num;
maxValue = Math.max(maxValue, num);
minValue = Math.min(minValue, num);
}
return (sum - maxValue - minValue) / (salary.length - 2);
}
}
- 时间复杂度:O(n),选取最大值、最小值和求和的过程的时间代价都是 O(n),故渐进时间复杂度为 O(n)
- 空间复杂度:O(1),这里只用到了常量级别的辅助空间
二、第二天:运算符
2.1、整数的各位积和之差
public int subtractProductAndSum(int n) {
int add = 0, mul = 1;
while (n > 0) {
int digit = n % 10; // 依次获得 个位、百位、千位。。 如 234 获得 个位4
n /= 10; // 将 n 去除上述代码所获得的位数 如 234 去除 个位4 为 23
add += digit;
mul *= digit;
}
return mul - add;
}