当前位置: 首页 > news >正文

【简单】从N个数中等概率打印M个数-Java

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程大家好!欢迎来到我的网站! 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑,人工智能时代就要来临了,科… 继续阅读 前言https://www.captainai.net/troubleshooter

package live.every.day.ProgrammingDesign.CodingInterviewGuide.Other; /** * 从N个数中等概率打印M个数 * * 【题目】 * 给定一个长度为N且没有重复元素的数组arr和一个整数n,实现函数等概率随机打印arr中的M个数。 * * 【要求】 * 1.相同的数不要重复打印。 * 2.时间复杂度为O(M),额外空间复杂度为O(1)。 * 3.可以改变arr数组。 * * 【难度】 * 简单 * * 【解答】 * 如果没有空间复杂度的限制,可以用哈希表标记一个数之前是否被打印过,就可以做到不重复打印。解法的关键点是利用要求3改变数 * 组arr。打印过程如下: * 1.在[0,N-1]中随机得到一个位置a,然后打印arr[a]。 * 2.把arr[a]和arr[N-1]交换。 * 3.在[0.N-2]中随机得到一个位置b,然后打印arr[b],因为打印过的arr[a]已被换到了N-1位置,所以这次打印不可能再次出现。 * 4.把arr[b]和arr[N-2]交换。 * 5.在[0,N-3]中随机得到一个位置c,然后打印arr[c],因为打印过的arr[a]和arr[b]已被换到了N-1位置和N-2位置,所以这次 * 打印都不可能再出现。 * 6.依此类推,直到打印M个数。 * 总之,就是把随机选出来的数打印出来,然后将打印的数交换到范围中的最后位置,再把范围缩小,使得被打印的数下次不可能再被选 * 中,直到打印结束。很多有关等概率随机的面试题都是用这种和最后一个位置交换的解法,希望这种小技巧能引起读者的重视。具体过 * 程请参看如下代码中的printRandM方法。 * * @author Created by LiveEveryDay */ public class FromNNumbersEquiprobabilityPrintMNumbers<K, V> { public static void printRandM(int[] a, int m) { if (a == null || a.length == 0 || m < 0) { return; } m = Math.min(a.length, m); int count = 0; int i = 0; while (count < m) { i = (int) (Math.random() * (a.length - count)); System.out.printf("%d ", a[i]); swap(a, a.length - count++ - 1, i); } } private static void swap(int[] a, int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; } public static void main(String[] args) { int[] a = {1, 4, 6, 7, 3, 9, 2, 8, 5, 0}; printRandM(a, 8); } } // ------ Output ------ /* 1 3 5 0 7 8 2 9 */
http://www.jsqmd.com/news/839544/

相关文章:

  • 别再只会用高斯模糊了!OpenCV实战:7种图像锐化算法效果对比(附Python/C++代码)
  • 1973~2024年各县区日度逐日平均气温、最高温、最低温面板数据
  • 2026 广州黄金回收全攻略:金价高位变现避坑,5 家正规门店实测对比 - 速递信息
  • 字符流中第一个只出现一次的字符-C++
  • C++ 列表初始化容器
  • 如何彻底清理Mac应用残留:免费开源的专业级系统优化工具完全指南
  • Android Studio 5分钟快速汉化指南:免费中文插件完整使用教程
  • 【Nanobot】README09_LEVEL4 添加新聊天渠道
  • Ultimate ASI Loader:Windows游戏插件加载终极指南,轻松实现零风险游戏修改
  • 3步实现微信聊天记录永久备份:WeChatExporter完整解决方案
  • 逃跑路线【牛客tracker 每日一题】
  • 告别玄学调试:用示波器和抓包工具搞定ARM ast1520与RTL8367的MDIO通信
  • Windows文件管理难题:如何让APK文件显示原生图标?
  • 2026年武汉办公室空调深度测评:如何为你的办公空间匹配最佳方案? - 速递信息
  • 晶晨T972嵌入式主板开发指南:从硬件选型到量产部署
  • 2026年全国人力资源咨询公司哪家好 专注落地服务 口碑良好的专业服务机构 - 深度智识库
  • MASA模组汉化包终极指南:快速解决Minecraft英文界面问题
  • WinForm上位机实战:5分钟用C#连接西门子PLC(Modbus TCP,含仿真环境搭建)
  • Windows平台防撤回利器:RevokeMsgPatcher深度技术解析与实战指南
  • SteamVR Unity插件终极指南:5分钟快速配置VR应用的完整教程
  • CSS 伪类完全指南
  • 2026海南自贸港税务服务市场调研:一份来自海南的市场侧记 - 速递信息
  • 【简单】一行代码求两个数的最大公约数-Java
  • 2026年帝舵中国区售后服务网络升级全流程记录(附最新电话及地址) - 亨得利官方服务中心
  • 上海创赢建筑科技:口碑好的上海围挡销售公司 - LYL仔仔
  • openclaw用户如何快速接入taotoken扩展ai能力
  • Grafana 9.5 版本启动报错 panic: runtime error 怎么解决?
  • 家庭日常水果挑选实用指南:兼顾口感、保鲜与营养留存 - 奔跑123
  • 在Windows上安装APK的完整指南:告别模拟器,拥抱原生体验
  • WeChatExporter:基于iOS备份解析的微信聊天记录数据提取架构