zoukankan      html  css  js  c++  java
  • leetcode 1093. Statistics from a Large Sample

    求一个数组的最小值,最大值,平均数,中位数与众数

    function sampleStats(count) {
                let ret = [], i, j
                //众数
                let most = -1;
                //中位数
                let medium = -1;
                //最小值
                let minimum = Infinity;
                //最大值
                let maximum = -Infinity;
                //平均值
                let average = -1;
                //出现次数最多的数出现了多少次
                let maxsum = -Infinity;
                //用于统计序列中数的个数
                let cnt = 0;
                //序列和 用于求平均值
                let sum = 0;
                for (i = 0; i < 256; i++) {
                    if (count[i] > 0) {
                        //找最大
                        if (i > maximum) {
                            maximum = i;
                        }
                        //找最小
                        if (i < minimum) {
                            minimum = i;
                        }
                        //为了求平均
                        sum += i * count[i];
                        cnt += count[i];
                        //找众数
                        if (count[i] > maxsum) {
                            most = i;
                            maxsum = count[i];
                        }
                    }
                }
    
                ret.push(minimum);
                ret.push(maximum);
                //求平均值
                average = sum / cnt;
                ret.push(average);
                //找中位数
                let nextcnt = 0;
                if (cnt % 2 == 1) {
                    //奇数
                    for (i = 0; i < 256; i++) {
                        if (count[i] > 0) {
                            if (nextcnt <= cnt / 2 && nextcnt + count[i] > cnt / 2) {
                                medium = i;
                                break;
                            }
                            nextcnt += count[i];
                        }
                    }
                } else {
                    //偶数
                    let pre = -1;
                    for (i = 0; i < 256; i++) {
                        if (count[i] > 0) {
                            if (nextcnt < cnt / 2 && nextcnt + count[i] > cnt / 2) {
                                medium = i;
                                break;
                            }
                            else if (nextcnt == cnt / 2 && nextcnt + count[i] > cnt / 2) {
                                medium = (i + pre) / 2.0;
                                break;
                            }
                            nextcnt += count[i];
                            pre = i;
                        }
                    }
                }
                ret.push(medium);
                ret.push(most);
    
                return ret;
            }
    
    

    更简洁的实现

    const sampleStats = function(count) {
      let min = Infinity;
      let max = -Infinity;
      let sum = 0;
      let totalCount = 0;
      let modCount = 0;
      let mod;
      
      for (let i = 0; i < count.length; i++) {
        if (!count[i]) continue;
        sum += i * count[i];
        totalCount += count[i];
        min = Math.min(min, i);
        max = Math.max(max, i);
        if (count[i] > modCount) {
          modCount = count[i];
          mod = i;
        }
      }
      
      const medIndex1 = Math.floor((totalCount - 1) / 2); 
      const medIndex2 = Math.ceil((totalCount - 1) / 2);
      
      let index = 0;
      let med1, med2;
      for (let i = 0; i < count.length; i++) {
        if (!count[i]) continue;
        index += count[i];
        if (med1 === undefined && medIndex1 < index) {
          med1 = i;
        }
        if (medIndex2 < index) {
          med2 = i;
          break;
        }
      }
      
      return [min, max, sum / totalCount, (med1 + med2) / 2, mod];
    };
    
  • 相关阅读:
    cf1100 F. Ivan and Burgers
    cf 1033 D. Divisors
    LeetCode 17. 电话号码的字母组合
    LeetCode 491. 递增的子序列
    LeetCode 459.重复的子字符串
    LeetCode 504. 七进制数
    LeetCode 3.无重复字符的最长子串
    LeetCode 16.06. 最小差
    LeetCode 77. 组合
    LeetCode 611. 有效三角形个数
  • 原文地址:https://www.cnblogs.com/rubylouvre/p/12151020.html
Copyright © 2011-2022 走看看