class Solution {
public double[] sampleStats(int[] count) {
double min = -1;
double max = -1;
double mean = 0;
double median = 0;
double mode = 0;
//min
for(int i = 0; i < 256; ++i){
if(count[i] != 0){
min = i;
break;
}
}
//max
for(int i = 255; i >= 0; --i){
if(count[i] != 0){
max = i;
break;
}
}
//mean
List<int[]> mem_List = new ArrayList<>();
double sum = 0;
int sum_size = 0;
int val_mode = -1;
for(int i = 0; i < 256; ++i){
if(count[i] != 0){
int[] temp_int = {i, count[i]};
mem_List.add(temp_int);
sum += i * count[i];
sum_size += count[i];
}
if(count[i] > val_mode){
val_mode = count[i];
mode = i;
}
}
mean = sum / sum_size;
//median
if(sum_size % 2 == 0){
int mid_index1 = sum_size / 2;
int mid_index2 = sum_size / 2 + 1;
int temp_sum = 0;
for(int i = 0; i < mem_List.size(); ++i){
temp_sum += mem_List.get(i)[1];
if(temp_sum >= mid_index2){
median = mem_List.get(i)[0];
break;
}else if(temp_sum == mid_index1){
median = (double)(mem_List.get(i)[0] + mem_List.get(i + 1)[0]) / 2;
break;
}
}
}else{
int mid_index = sum_size / 2 + 1;
int temp_sum = 0;
for(int i = 0; i < mem_List.size(); ++i){
temp_sum += mem_List.get(i)[1];
if(temp_sum >= mid_index){
median = mem_List.get(i)[0];
break;
}
}
}
double[] result = {min, max, mean, median, mode};
return result;
}
}
改进版
class Solution {
public double[] sampleStats(int[] count) {
double min = Double.MAX_VALUE;
double max = Double.MIN_VALUE;
double mean = -1;
double mid = -1;
double mode = -1;
for(int i = 0; i < count.length; ++i){
if(count[i] != 0){
min = i;
break;
}
}
for(int i = count.length - 1; i >= 0; --i){
if(count[i] != 0){
max = i;
break;
}
}
double sum = 0;
int sum_length = 0;
int val_mode = -1;
for(int i = 0; i < count.length; ++i){
sum += i * count[i];
sum_length += count[i];
if(val_mode < count[i]){
val_mode = count[i];
mode = i;
}
}
mean = sum / sum_length;
int mid_num1 = (sum_length + 1) / 2;
int mid_num2 = (sum_length + 2) / 2;
int l = -1;
int r = -1;
int mid_sum = 0;
for(int i = 0; i < count.length; ++i){
mid_sum += count[i];
if(l == -1 && mid_sum >= mid_num1){
l = i;
}
if(r == -1 && mid_sum >= mid_num2){
r = i;
break;
}
}
mid = (double) (r + l) / 2;
return new double[]{min, max, mean, mid, mode};
}
}