day 4:2028. 找出缺失的观测数据

news2024/11/14 14:15:54

Leetcode 2028. 找出缺失的观测数据

现有一份 n + m 次投掷单个** 六面** 骰子的观测数据,骰子的每个面从 1 到 6 编号。观测数据中缺失了 n 份,你手上只拿到剩余 m 次投掷的数据。幸好你有之前计算过的这 n + m 次投掷数据的 平均值

给你一个长度为 m 的整数数组 rolls ,其中 rolls[i] 是第 i 次观测的值。同时给你两个整数 mean 和 n 。

返回一个长度为_ n 的数组,包含所有缺失的观测数据,且满足这 n + m 次投掷的 平均值 _mean 。如果存在多组符合要求的答案,只需要返回其中任意一组即可。如果不存在答案,返回一个空数组。

k 个数字的 平均值 为这些数字求和后再除以 k 。

注意 mean 是一个整数,所以 n + m 次投掷的总和需要被 n + m 整除。

image.png

已知部分数据、平均值即数据量大小,求平均值。那么就可以得到未知数据的总和。

int m = rolls.length;
int sum = 0;
for (int i = 0 ; i < m; i++) {
    sum += rolls[i];
}

int rest = (m + n) * mean - sum;

需要判断得到的 rest 是否符合要求,不符合要求就直接返回 null 或一个长度为 0 的数组。

if (rest < n || rest > (n * 6)) return new int[0];

那么就是知道位置数组的总和的数据量大小,只需要返回其中一个结果。

  • 贪心法,让前面的数据尽可能大,或者让前面的数据尽可能小,这两种实现类似。
  • 平均法,让数组数据保持一个平均值。
  • 随机法,真的每次获取一个随机数,但是要记得保证。

贪心法:

// 代码 1 
for (int i = 0; i < n - 1; i++) {
    int num = 6;
    while ((rest - num) < (n - i - 1)) num--;
    res[i] = num;
    rest -= num;
}
res[n - 1] = rest;

// 代码 2
int num = 6;
for (int i = 0; i < n - 1; i++) {
    while ((rest - num) < (n - i - 1)) num--;
    res[i] = num;
    rest -= num;
}
res[n - 1] = rest;

比较一下代码 1 和 代码 2 的区别,就是局部变量的位置,一个在作用域包括 for 循环外,一个只作用在循环内。
后者需要在判断一次之前已经判断过的情况,因此会导致重复的计算浪费实现。
结果证明其时间有 6ms 变为了 3ms。

上述是让前面的数据尽可能大。如果想让前面的数据尽可能小,只要让 num 从 1 开始,修改 while 的条件为 while((res - num) > ((n - i - 1) * 6)) num++;即可。

平均法:

int num = rest / n;
for (int i = 0; i < n - 1; i++) {
    while ((rest - num) > ((n - i - 1) * 6)) num++;
    res[i] = num;
    rest -= num;
}
res[n - 1] = rest;

这种方式还是逃不掉 for 循环判断剩余的能否放下。效率还是一样的。

随机法:

Random random = new Random();
for (int i = 0; i < n - 1; i++) {
    int num = random.nextInt(5) + 1;
    while (((rest - num) < (n - i - 1)) || ((rest - num) > ((n - i - 1) * 6))) {
        num = random.nextInt(5) + 1;
    }
    res[i] = num;
    rest -= num;
}
res[n - 1] = rest;

哈哈,非常浪费时间,在一些特殊情况下,即结果都为 1 或都为 6,可能永远也取不到想要的值。

完整代码

class Solution {
    public int[] missingRolls(int[] rolls, int mean, int n) {
        int m = rolls.length;
        int sum = 0;
        for (int i = 0 ; i < m; i++) {
            sum += rolls[i];
        }

        int rest = (m + n) * mean - sum;
        if (rest < n || rest > (n * 6)) return new int[0];
        int res[] = new int[n];
        int num = 6;
        for (int i = 0; i < n - 1; i++) {
            while ((rest - num) < (n - i - 1)) num--;
            res[i] = num;
            rest -= num;
        }
        res[n - 1] = rest;
        return res;
    }
}

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

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

相关文章

IDEA出现javax.servlet.http包错误解决方法

问题原因&#xff1a;缺少对应的jar包&#xff0c;其实tomcat服务器自带与HTTP一些相关的Jar包&#xff0c;没有导入进去。 解决方案1&#xff1a; 导入对应jar包 <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</…

QT使用gsoap获取手机归属地

1-环境变量 用的win32 E:\hes_scc\tools\gsoap_2.8.134\gsoap-2.8\gsoap\bin\win32 2-生成代码接口 自己建一个目录&#xff0c;在此打开cmd窗口&#xff0c;生成的文件都会在这个文件夹中。 这里用的手机归宿地。 wsdl2h -o GetPhoneInfo.h -s -n Phone -t ....\typemap.…

Java(其十二)--集合·初级

ArrayList集合 集合有很多种&#xff0c;ArrayList 是最常用的一种&#xff0c;集合的作用相当于C中的STL 最显著的特点就是&#xff1a;自动扩容。 一般定义式 ArrayList list new ArrayList(); //该 list 是可以储存各种类型的数据的&#xff0c;要想约束储存的数据&#x…

安装appium自动化测试环境,我自己的版本信息

教程来自&#xff1a;Appium原理与安装 - 白月黑羽 我的软件的版本&#xff1a; 安装是选择为自己安装而不是选all user pip install appium-python-client命令在项目根目录下安装appium-python-client sdk的话最简单的安装方式就是去Android官网下一个android studio然后在…

【class17】人工智能初步-----语音识别(3)

【class16】 上节课&#xff0c;我们学习了&#xff1a;wav文件的相关概念知识&#xff0c;并通过代码从视频中获取了音频以及设置了参数。学习新的课程之前&#xff0c;我们先来复习一下吧&#xff01; 代码复习 将上节课学习的代码分为两个部分&#xff1a; part1. 获取音频…

Suricata-入门实验-快速理解suricata

实验环境&#xff1a; 主机win10 ip地址&#xff1a;192.168.121.1 虚拟机使用vm ubuntu20.04 ip地址&#xff1a;192.168.121.128 实验目标&#xff1a; 从主机 给虚拟机 发送ping 命令 虚拟机中Suricata接收到ping后发出告警信息。 正文 在前面 编译好Suricata后&#x…

PTA 计算矩阵两个对角线之和

计算一个nn矩阵两个对角线之和。 输入格式: 第一行输入一个整数n(0<n≤10)&#xff0c;第二行至第n1行&#xff0c;每行输入n个整数&#xff0c;每行第一个数前没有空格&#xff0c;每行的每个数之间各有一个空格。 输出格式: 两条对角线元素和&#xff0c;输出格式见样例…

想知道期权的交易方式有哪些吗?新手必看!

今天期权懂带你了解想知道期权的交易方式有哪些吗&#xff1f;新手必看&#xff01;期权指投资者在支付了一定的权利金之后&#xff0c;将拥有未来某个时间协定价格买入或者卖出的权利。 期权的交易策略方式有哪些&#xff1f; 买入看涨期权&#xff1a; 使用场景&#xff1a…

【算法】位运算——常见位运算基础操作总结

位运算基础操作总结&#xff0c;包括基础运算符 修改某位bit位 目录 1.基础位运算符2.按位基础操作1.给一个数 n&#xff0c;确定其二进制的第 x 位是 0/12.将一个数 n 的二进制标识的第 x 位修改成 13.将一个数 n 的二进制标识的第 x 位修改成 04.提取一个数 n 二进制中最右侧…

Centos 7 安装刻录至服务器

前言 在日常测试中&#xff0c;会遇到很多安装的场景&#xff0c;今天给大家讲一下centos 7 的安装&#xff0c;希望对大家有所帮助。 一.下载镜像 地址如下&#xff1a; centos官方镜像下载地址https://www.centos.org/download/ 按照需求依次点击下载 二.镜像刻录 镜像刻…

【Spring】Spring AOP底层原理:JDK动态代理和CGLIB动态代理

目录 1、代理模式 1.1、静态代理 1.2、动态代理 2、JDK 动态代理 2.1、jdk动态代理简介 2.2、使用JDK动态代理机制步骤 3、CGLIB 动态代理 3.1、CGLIB 动态代理的特性 3.2、CGLIB的核心类 3.3、CGLIB 动态代理步骤 4、JDK 和 CGLIB 创建代理对象的区别 ​编辑 1、…

Linux网络编程:传输层协议|UDP

知识引入&#xff1a; 端口号&#xff1a; 当应用层获得一个传输过来的报文时&#xff0c;这时数据包需要知道&#xff0c;自己应该送往哪一个应用层的服务&#xff0c;这时就引入了“端口号”&#xff0c;通过区分同一台主机不同应用程序的端口号&#xff0c;来保证数据传输…

【高数】重点内容,公式+推导+例题,大学考试必看

目录 1 隐函数求导1.1 公式1.2 说明1.3 例题 2 无条件极值2.1 运用2.2 求解2.3 例题 3 条件极值3.1 运用3.2 求解3.3 例题 4 二重积分4.1 直角坐标下4.2 极坐标下4.3 例题 5 曲线积分5.1 第一型曲线积分5.2 第二型曲线积分5.3 例题 6 格林公式6.1 公式6.2 说明6.3 例题 &#x…

【强化学习】Q-learning,DQN,SARSA算法介绍

【强化学习】Q-learning&#xff0c;DQN&#xff0c;SARSA算法介绍 强化学习算法分类基于价值的方法基于策略的方法Actor-Critic方法 Q-learning算法DQN算法强化学习训练数据存在的问题经验回放机制备份网络机制 Sarsa算法总结 强化学习算法分类 按学习目标进行分类 可分为基于…

信息化赋能:干部监督工作的创新与实践

随着信息技术的迅猛发展&#xff0c;信息化手段在干部监督工作中的应用越来越广泛&#xff0c;为提升监督工作的效率和精准度提供了有力支持。以下是如何利用信息化手段扎实推进干部监督工作的几点建议&#xff1a; 一、搭建信息化平台&#xff0c;实现数据统一管理 要扎实推…

【unity小技巧】unity读excel配置表操作,excel转txt文本,并读取txt文本内容,实例说明

文章目录 前言下载资源库导入资源库excel转txt文本读取txt内容 读取配置表所有的数据&#xff0c;并使用结束语 前言 关于unity读excel配置表操作&#xff0c;其实之前就有用过&#xff0c;这里只是单独整理出这部分知识&#xff0c;后续好使用。 感兴趣可以去看看&#xff1a…

【408精华知识】时钟周期、机器周期、总线周期、指令周期、存取周期还傻傻分不清?

在做题时&#xff0c;我们经常能遇到关于“周期”的表述&#xff0c;比如时钟周期、机器周期、总线周期、指令周期、存取周期&#xff0c;类似的表述让我们很容易迷茫&#xff0c;那么接下来我们就看看它们到底是什么、有什么区别&#xff1f; 周期特点时钟周期也称为CPU时钟周…

太速科技-基于FPGA Spartan6 的双路光纤PCIe采集卡(2路光纤卡)

基于FPGA Spartan6 的双路光纤PCIe采集卡(2路光纤卡) 1、板卡概述   板卡采用xilinx Spartan6系列芯片&#xff0c;支持 PCI Express Base Specification 1.1 x1。内含丰富的逻辑资源和存储单元&#xff0c;板卡FPGA外接双片32M*16bit DDR2缓存器&#xff0c;支持乒乓操作。…

【Linux进程篇】父子进程fork函数||进程生死轮回状态||僵尸进程与孤儿进程

W...Y的主页 &#x1f60a; 代码仓库分享&#x1f495; 前言&#xff1a;上篇文章中我们认识了进程&#xff0c;可执行程序在内存中加载运行被称作进程&#xff0c;而操作系统是通过给每一个可执行程序创建一个PCB来管理进程的。并且学习了一些查看进程的指令&#xff0c;认识…