一、大样本统计(Weekly Contest 142)

题目描述:
我们对 0 到 255 之间的整数进行采样,并将结果存储在数组 count 中:count[k] 就是整数 k 的采样个数。

我们以 浮点数 数组的形式,分别返回样本的最小值、最大值、平均值、中位数和众数。其中,众数是保证唯一的。

我们先来回顾一下中位数的知识:

如果样本中的元素有序,并且元素数量为奇数时,中位数为最中间的那个元素;
如果样本中的元素有序,并且元素数量为偶数时,中位数为中间的两个元素的平均值。

示例 1:

输入:count = [0,1,3,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
输出:[1.00000,3.00000,2.37500,2.50000,3.00000]
示例 2:

输入:count = [0,4,3,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
输出:[1.00000,4.00000,2.18182,2.00000,1.00000]

提示:

count.length == 256
1 <= sum(count) <= 10^9
计数表示的众数是唯一的
答案与真实值误差在 10^-5 以内就会被视为正确答案

思路:
题目的意思就是count[index] = k,表示出现了k个index,这样就明白了
中位值的计算可能需要一些技巧

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
class Solution {
    public double[] sampleStats(int[] count) {
    int max = Integer.MIN_VALUE;
    	int min = Integer.MAX_VALUE;
    	double sum = 0;
    	double []result = new double[5];
    	int index = 0;
    	int size = 0;
    	int zhongshu = 0;
    	int time = 0;
    	for (int i = 0; i < count.length; i++) {
			if(count[i] != 0){
				min = i;
				break;
			}
		}
    	Map<Integer, Integer> getMap = new TreeMap<>();
    	for (int i = count.length - 1; i >= 0; i--) {
    		if(count[i] != 0){
				max = i;
				break;
			}
		}
    	for (int d : count) {
    		if(time < d){
    			time = d;
    			zhongshu = index;
    		}
    		sum += d * index;
    		if(d != 0){
    			getMap.put(index, d);
    		}
    		index ++;
    		size += d;
		}
    	
    	result[0] = min;
    	result[1] = max;
    	result[2] = (double)(sum / (size * 1.0));
    	int mid = 0;
    	int num1 = 0;
    	int num2 = 0;
    	boolean flag = true;
    	for (Entry<Integer, Integer> integer : getMap.entrySet()) {
			mid += integer.getValue();
			if(mid >= size / 2  && flag){
				num1 = integer.getKey();
				flag = false;
			}
			if(mid >= size / 2 + 1){
				num2 = integer.getKey();
				break;
			}
    	}
  
    	if(size % 2 == 1){
    		result[3] = num1;
    	}else {
    		result[3] = (num1 + num2)  / 2.0;
		}
    	result[4] = zhongshu;
    	return result;
    }
}

代码写的比较复杂了,取最大和最小值我是分开了

这个代码就显得比较简单了

class Solution {
    public double[] sampleStats(int[] count) {
        double[] result = new double[5];
        int minV = -1,maxV=-1,ct = 0,maxC=-1;
        long sum = 0;
        for(int i=0;i<count.length;++i){
            if(count[i]!=0){
                maxV=i;
                if(minV==-1)
                    minV=i;
                if(maxC==-1||count[i]>count[maxC])
                    maxC=i;
            }
            sum+=i*count[i];
            ct+=count[i];
        }
        int findCt = (ct+1)/2;
        int temp = 0;
        int ctV = 0;
        for(int i=0;i<count.length;++i){
            if(count[i]>0) {
                findCt -= count[i];
                if (findCt <= 0) {
                    ctV += i;
                    break;
                }
            }
        }
        findCt = (ct+1)/2;
        for(int i=count.length-1;i>=0;--i){
            if(count[i]>0) {
                findCt -= count[i];
                if (findCt <= 0) {
                    ctV += i;
                    break;
                }
            }
        }
        result[0] = (double)minV;
        result[1] = (double)maxV;
        result[2] = (double)sum;
        result[3] = (double)ctV;
        result[4] = (double) maxC;
        result[2]/=ct;
        result[3]/=2;
        return result;

    }
}

<think>好的,我现在需要帮助用户解决如何在大屏展示模块中实现当月统计和当周统计数据轮播效果的问题。首先,我需要理解用户的需求。用户希望在个大屏上,数据能够自动切换显示当周和当月的统计信息,类似于轮播图的效果。这样可以让观众在同块屏幕上看到不同时间维度的数据,提升信息展示的效率。 接下来,我要考虑实现这个功能的技术方案。用户可能使用的是前端框架,比如Vue、React或者Angular,或者是纯HTML/CSS/JavaScript。根据常见的大屏开发情况,可能涉及数据可视化库如ECharts或D3.js,以及定时任务来控制轮播。另外,可能还需要考虑数据动态更新和界面布局的适配问题。 首先,布局设计。用户需要同时展示当周和当月的数据,但可能由于屏幕空间有限,需要轮播切换。可能需要两个容器,个显示当周,个显示当月,通过CSS控制显示和隐藏。或者使用个容器,动态切换内容。使用CSS的flex布局或grid布局来管理这两个区块的位置,确保在不同屏幕尺寸下都能适配。 然后是数据切换逻辑。需要设置定时器,每隔定时间(比如10秒)切换次显示的数据。可以使用JavaScript的setInterval函数来实现定时切换。同时,当用户点击某个按钮时,也可以手动切换,这可能涉及到事件监听器的添加和移除。 数据动态更新方面,可能需要从后端API获取最新的统计数据。因此,在每次切换时,可能需要发起AJAX请求,获取最新的数据,更新到对应的图表或数据展示组件中。这里需要考虑数据更新的频率,避免频繁请求导致服务器压力过大,同时也要保证数据的及时性。 动画效果方面,为了让切换更平滑,可以添加CSS过渡或动画效果,比如淡入淡出、滑动等。例如,使用opacity属性结合transition来实现淡入淡出效果,或者使用transform属性来实现左右滑动效果。 另外,需要考虑响应式设计,确保轮播效果在不同屏幕尺寸下都能正常显示。可能需要使用媒体查询(media queries)来调整布局和样式,或者使用百分比和视口单位(vw/vh)来设置元素的大小。 最后,测试和优化。在实现基本功能后,需要测试不同浏览器的兼容性,尤其是如果用户使用的是老旧浏览器,可能需要添加polyfill或者回退方案。同时,性能优化也很重要,比如合理管理定时器,避免内存泄漏,优化数据请求的频率等。 可能遇到的问题包括定时器与数据请求的同步问题,比如在数据尚未加载完成时切换导致显示错误,或者动画卡顿等。需要确保数据预加载,或者在切换前检查数据是否就绪。此外,如果用户同时需要其他交互功能,比如暂停轮播,可能需要添加相应的控制按钮和逻辑。 总结下来,实现步骤大致分为布局设计、数据切换逻辑、数据动态更新、动画效果添加、响应式处理以及测试优化几个部分。每个部分都需要详细考虑可能的实现方式和潜在问题,确保最终效果符合用户需求。</think>### 大屏数据轮播效果实现方案 #### 、基础布局方案 1. **双容器交替显示** ```html <div class="stats-container"> <div class="stat-item active" id="weekly-stats"> <h3>当周统计</h3> <div class="chart-container"></div> </div> <div class="stat-item" id="monthly-stats"> <h3>当月统计</h3> <div class="chart-container"></div> </div> </div> ``` ```css .stats-container { position: relative; height: 600px; } .stat-item { position: absolute; opacity: 0; transition: opacity 0.5s ease; width: 100%; } .stat-item.active { opacity: 1; } ``` #### 二、核心切换逻辑 ```javascript let currentStat = 'weekly'; const intervalTime = 10000; // 10秒切换 function toggleStats() { const weeklyElement = document.getElementById('weekly-stats'); const monthlyElement = document.getElementById('monthly-stats'); if(currentStat === 'weekly') { weeklyElement.classList.remove('active'); monthlyElement.classList.add('active'); currentStat = 'monthly'; } else { monthlyElement.classList.remove('active'); weeklyElement.classList.add('active'); currentStat = 'weekly'; } // 预加载下次数据 fetchData(currentStat === 'weekly' ? 'monthly' : 'weekly'); } // 初始化定时器 let switchTimer = setInterval(toggleStats, intervalTime); // 暂停/恢复功能 document.getElementById('pauseBtn').addEventListener('click', () => { clearInterval(switchTimer); }); document.getElementById('resumeBtn').addEventListener('click', () => { switchTimer = setInterval(toggleStats, intervalTime); }); ``` #### 三、数据动态加载(示例使用ECharts) ```javascript async function fetchData(type) { const response = await fetch(`/api/stats/${type}`); const data = await response.json(); const chartDom = document.querySelector(`#${type}-stats .chart-container`); const chart = echarts.init(chartDom); const option = { tooltip: { trigger: 'axis' }, xAxis: { type: 'category', data: data.dates }, yAxis: { type: 'value' }, series: [{ data: data.values, type: 'bar', itemStyle: { color: '#5470c6' } }] }; chart.setOption(option); // 窗口大小改变时自适应 window.addEventListener('resize', () => chart.resize()); } ``` #### 四、优化建议 1. **预加载策略**:在显示当前模块时预加载下个模块数据 2. **过渡动画增强**:使用`transform`实现3D翻转效果 ```css .stat-item { transform: rotateY(180deg); backface-visibility: hidden; transition: transform 1s; } .active { transform: rotateY(0deg); } ``` 3. **数据缓存**:使用sessionStorage存储最新数据 ```javascript function fetchData(type) { if(sessionStorage.getItem(type)) { renderChart(JSON.parse(sessionStorage.getItem(type))); } // 继续请求最新数据... } ``` #### 五、注意事项 1. 定时器内存管理:离开页面时清除定时器 2. 数据更新冲突处理:使用请求锁机制 3. 大屏适配方案:使用rem单位配合缩放函数 ```scss @function vw($px) { @return ($px / 1920) * 100vw; } .chart-container { width: vw(1200); height: vw(800); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值