LEETCODE 每日一题 1093.大样本统计

news2025/1/18 18:43:48

题目描述 前往leetcode1093题

我们对 0 到 255 之间的整数进行采样,并将结果存储在数组 count 中:count[k] 就是整数 k 在样本中出现的次数。
计算以下统计数据:
minimum :样本中的最小元素。
maximum :样品中的最大元素。
mean :样本的平均值,计算为所有元素的总和除以元素总数。
median :
如果样本的元素个数是奇数,那么一旦样本排序后,中位数 median 就是中间的元素。
如果样本中有偶数个元素,那么中位数median 就是样本排序后中间两个元素的平均值。
mode :样本中出现次数最多的数字。保众数是 唯一 的。
以浮点数数组的形式返回样本的统计信息 [minimum, maximum, mean, median, mode] 。与真实答案误差在 10-5 内的答案都可以通过。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/statistics-from-a-large-sample
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

  1. 恢复原数据:我的办法是利用ArrayList tmp恢复原始数据,并利用tmp进行数据计算
    public double[] sampleStats(int[] count) {
        double[] res = new double[5];
        int max = -1;
        int index = 0;
        // 用来恢复原始数据
        ArrayList<Integer> tmp = new ArrayList<>();
        for(int i = 0; i< count.length; i++){
            if(count[i] > max){
                max = count[i];
                index = i;
            }
            for(int j = 0; j< count[i];j++){
                tmp.add(i);
            }
        }
        int len = tmp.size();
        // 统计数据
        res[0] = tmp.get(0);
        res[1] = tmp.get(len-1);
        res[2] = tmp.stream().mapToInt(Integer::intValue).sum() * 1.0/len;
        res[3] = len%2==0 ? (tmp.get(len/2) + tmp.get((len/2)-1))*1.0/2 : tmp.get(len/2);
        res[4] = index;
        return res;
    }

但是提交代码时报错,提示超出内存限制
在这里插入图片描述
2. 优化代码

  • 使用多个单独的变量而不是数组,并且只在必要时分配它们,以减少内存使用;
  • 通过直接在循环中跟踪最大值、最小值、总和、总计数等信息,从而避免多次操作数组;
  • 将寻找中位数的计算移到单独的方法中,以使主方法更加简洁和易读。
    public double[] sampleStats(int[] count) {
        int max = -1, min = -1;
        double sum = 0.0;
        int totalCount = 0;
        int mode = 0, modeCount = 0;
        
        for (int i = 0; i < count.length; i++) {
            if (count[i] != 0) {
                if (min == -1) {
                    min = i;
                }
                max = i;
                totalCount += count[i];
                sum += i * count[i];
                if (count[i] > modeCount) {
                    modeCount = count[i];
                    mode = i;
                }
            }
         }            
        
        return new double[]{ min, max, sum / totalCount,
             totalCount % 2 == 0 ? (findKthNumber(count, totalCount / 2) + findKthNumber(count, totalCount / 2 - 1)) / 2.0 : findKthNumber(count, totalCount / 2),
             mode };
    }
    
    private int findKthNumber(int[] count, int k) {
        int totalCount = 0;
        for (int i = 0; i < count.length; i++) {
            totalCount += count[i];
            if (totalCount > k) {
                return i;
            }
        }
        return -1;
    }

接下来 提交代码, 又错了!!!调试时发现平均值竟然出现了负数!!
在这里插入图片描述

分析原因:正数相乘得到负数是由于计算机内部数据类型的限制,造成数值溢出并被强制转换为负数所导致的结果(知道这个概念,可是使用过程中没遇到过此类问题,这是第一次,好吧 我是小白菜~)
解决办法:将操作数强制转换为long类型,在进行相乘操作时,会优先按照long类型进行计算,然后将结果再强制转换回int类型。这样可以避免数值溢出,从而得到正确的结果。

修改代码sum += i * count[i];sum += (long) i * count[i];
最终代码如下:

public double[] sampleStats(int[] count) {
        int max = -1, min = -1;
        double sum = 0.0;
        int totalCount = 0;
        int mode = 0, modeCount = 0;
        
        for (int i = 0; i < count.length; i++) {
            if (count[i] != 0) {
                if (min == -1) {
                    min = i;
                }
                max = i;
                totalCount += count[i];
                sum += (long) i * count[i];
                if (count[i] > modeCount) {
                    modeCount = count[i];
                    mode = i;
                }
            }
         }            
        
        return new double[]{ min, max, sum / totalCount,
             totalCount % 2 == 0 ? (findKthNumber(count, totalCount / 2) + findKthNumber(count, totalCount / 2 - 1)) / 2.0 : findKthNumber(count, totalCount / 2),
             mode };
    }
    
    private int findKthNumber(int[] count, int k) {
        int totalCount = 0;
        for (int i = 0; i < count.length; i++) {
            totalCount += count[i];
            if (totalCount > k) {
                return i;
            }
        }
        return -1;
    }

最后成功啦!
在这里插入图片描述

ps:工作后很久没有刷题了,今天登录看了一下手痒痒便做了起来,整个过程还是很生涩的, Java中ArrryList的各种操作都想不起来了,以为要做很久,没想到一个小时就解决了(有点超出我的预期),由于思维变慢,解题过程中不能规避可能会遇到的问题,只能通过提交代码来一次次尝试,希望以后不断的积累来提升自己。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/576143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Log】About these two years

文章目录 第一篇博客&#xff1f;成长收获的季节Future 第一篇博客&#xff1f; 第一次在CSDN发布博客&#xff0c;是当初我学习嵌入式的时候&#xff0c;那个时候我们做了一个大创&#xff0c;其中使用到了激光雷达&#xff0c;然后我就负责激光雷达部分代码的编写和设计&…

AI-新手玩转RKNN

关于RKNN RKNN 是Rockchip npu 平台使用的模型类型&#xff0c;以.rknn后缀结尾的模型文件。Rockchip 提供了完整了模型转换 Python 工具&#xff0c;方便用户将自主研发的算法模型转换成 RKNN 模型&#xff0c;同时 Rockchip 也提供了C/C和Python API 接口。 #mermaid-svg-M7l…

电子器件系列37:SD卡座(Push-Push和Push-Pull)

SD卡座是目前最通用的数据存储卡座、记忆卡座。在各种通讯数码产品、安防产品、带储存类产品等设备上都有所应用。有着性价比高、存储容量大、使用便捷、通用性以及安全性强等特点。自弹式SD卡座的卡槽底部会设有一个小直径、小线径的弹簧或一种切口式弹片。当装入SD卡时&#…

Kafka如何保证数据高可靠

这节课给大家分享一下Kafka的数据高可靠。为什么要讲这个&#xff1f;因为Kafka它本身不是一个金融级别数据可靠的分布式消息系统。 虽然说它存储到某个topic里的数据会先拆分多个partition&#xff0c;这体现了分治的一个思想。每一个partition在最终存储的时候会保存多个副本…

117.【微信小程序】

微信小程序 (一)、微信小程序概括1.微信小程序简介(1).小程序与普通网页开发的区别 2.注册微信小程序账号(1).注册小程序账号(2).获取小程序的AppID 3.安装微信开发者工具(1).微信开发者工具的简介:(2).微信开发者工具的下载 4.创建第一个小程序(1).创建小程序步骤(2).开发者工…

域横向移动-传递攻击atschtasks

横向移动就是拿下对方一台主机后&#xff0c;以拿下的那台主机作为跳板&#xff0c;对内网的其他主机再进行后渗透&#xff0c;拿到其他内网主机的权限的过程。叫做横向移动。横向移动的主要目的就是扩大战果。 传递攻击主要建立在明文和hash值获取基础上进行攻击。 at和scht…

Typora改变字体颜色

方法一&#xff1a;下载AutoHotkey并创建快捷键的方法&#xff08;推荐&#xff09; 第一步&#xff1a;在官网&#xff08;https://www.autohotkey.com/&#xff09;下载 AutoHotkey并傻瓜式安装&#xff0c;安装在任意盘符下均可&#xff1b; 第二步&#xff1a;在安装目录…

STM32F4_I2C(从机EEPROM/MPU-6050)协议详解

目录 1. I2C是什么 2. I2C物理层介绍 3. I2C协议层介绍 3.1 I2C基本读写过程 3.1.1 通讯复合格式 3.2 通讯的起始和停止信号 3.3 数据有效性 3.4 地址及数据方向 3.5 响应 4. STM32的I2C特性及架构 4.1 I2C架构剖析 5. I2C通讯过程 5.1 主发送器 5.2 主接收器 6…

Windows文件自动备份——“使用文件历史记录进行备份”

一、背景 因为有一些重要的文件需要经常改动&#xff0c;同时也有“找到某文件某历史版本”的需求&#xff0c;但考虑到时常手动备份比较麻烦&#xff0c;就想到了使用Windows自带的文件备份功能——“使用文件历史记录进行备份”来帮助进行文件的备份和版本管理。 二、环境 1…

一个测试开发人员在字节的7年,太真实了...

测试这条路是坎坷的&#xff0c;我自己深有体会。 我们的起点低&#xff0c;基础差。 测试这个职位也很尴尬&#xff0c;很少有公司会有针对性的对测试人员做成长规划&#xff0c;也很少有公司会那么重视测试人员&#xff0c; 也许进了像 BATJ 这样的大厂会好一点。 但是大多数…

nacos2.2.1搭建

springboot 3.0集成nacos2.2.1内容可评论区Q我 搭建环境&#xff1a; Java版本&#xff1a;11.0.18 系统&#xff1a;window7 数据库&#xff1a;mysql8.0.29 第一步&#xff0c;下载nacos&#xff0c;下载地址&#xff1a; https://github.com/alibaba/nacos/releases/d…

HACKABLE: III实战演练

文章目录 HACKABLE: III实战演练一、前期准备1、相关信息 二、信息收集1、端口扫描2、访问网站3、查看网站源码4、扫描目录5、访问网址6、查看并下载7、访问网站8、查看文件9、解密10、访问网站11、访问网站12、查看文件13、解密14、访问网站15、访问网站16、下载图片17、隐写1…

CrossOver软件好用吗?最新版22.1.1有哪些优势功能

CrossOver2023是一款系统兼容软件 让您可以在Mac和Linux系统上运行Win应用&#xff0c;不必重启系统&#xff0c;不必使用虚拟机。通过CrossOver&#xff0c; 您可以从dock直接启动Wind应用&#xff0c;与您的Mac和Linux系统功能无缝集成。crossover兼容软件是可以在苹果电脑中…

oracle的基本使用(建表,操作表等)

一、表空间&#xff0c;用户 1、创建表空间 使用system登录 创建表空间 waterboss 为表空间名称datafile 用于设置物理文件名称size 用于设置表空间的初始大小autoextend on 用于设置自动增长&#xff0c;如果存储量超过初始大小&#xff0c;则开始自动扩容next 用于设置每次…

tiechui_lesson14_网络连接请求的拦截

这一节主要学习网络请求的过滤&#xff0c;铁锤大佬讲了些关于IRP的知识。 笔记 先祭出一张灵魂作画&#xff0c;这是用来描述IRP的流转形式的。 通过这幅图着重解释了一下IoSkipCurrentIrpStackLocation(pirp);的过程&#xff0c;就是在流转到当前的IRP请求之后&#xff0c…

Jarvis OJ pwn——level1

checksec&& 运行 ida main函数里的vulnerable_function函数存在溢出 给输入分配的栈空间为0x88 利用思路 ret2shellcode 代码 Author : 白银 Date : 2023-05-27 14:43:28 LastEditors : 白银 LastEditTime : 2023-05-27 16:52:19 FilePath : /pw…

五十行代码教你写一个简单的内存池(二级指针的应用)

固定大小内存的内存池实现 该内存池是一个很简单的内存池&#xff0c;只能申请固定大小的内存&#xff0c;仅供学习 要点&#xff1a; 构造隐式链表二级指针 存储结构 typedef struct mempool_s{int block_size; // 每一块的大虚哎int free_count; // 剩余有多少块是可以…

C#医院LIS系统源码 LIS实验室管理信息系统源码 LIS检验系统源码

1、LIS系统技术框架 &#xff08;1&#xff09;总体框架&#xff1a; SaaS架构的Client/Server应用 服务可伸缩&#xff0c;多服务协同 服务可拆分&#xff0c;功能易扩展 &#xff08;2&#xff09;技术细节&#xff1a; 体系结构&#xff1a;Client/Server架构 客户端…

资深SRE带你看阿里云香港故障

一、故障背景 12月18日阿里云香港Region发生重大故障&#xff0c;多个重要互联网服务受到影响&#xff0c;包括澳门日报、金融管理局、澳门银河、莲花卫视、澳门水泥厂等基础服务&#xff0c;澳觅和MFood等外卖平台&#xff0c;多个区块链交易所也受到影响。详情见官方故障报告…

第12课【DMA 直接数据访问】直接数据访问 效率 数据总线冲突 通道 仲裁器

目录 简介功能框图请求通道仲裁器 使用配置传输方向数据量传输模式 实例分析存储器间传输存储器到外设 简介 DMA&#xff08;Direct Memory Access 直接内存访问&#xff09;指的是STM32中的一个外设。它可以在无需CPU介入的情况下&#xff0c;实现外设和存储器之间或存储器与…