目录题目思路Code题目题目内容给定一个包含 n 个整数的数组 nums 和一个整数 k需要将 nums 中的所有元素重新排列生成一个新的序列。数组下标从 0 开始新序列中下标为 k-1 的元素和下标为 k 的元素不能相同。请统计满足条件的不同排列数量相同的数组排列只统计一次如果无法构造出满足条件的数组输出 0。1 ≤ n ≤ 151 ≤ nums[i] ≤ 1001 ≤ k ≤ n-1。输入描述第一行输入以英文逗号分隔的数组 nums。第二行输入限制索引 k。输出描述输出满足条件的不同数组排列数量。样例 1输入2,2,3 1输出2说明只有 [3,2,2] 和 [2,3,2] 两种不同排列满足下标 0 与下标 1 的元素不同。思路整体思路先计算多重集合的全部不同排列数量再减去两个限制位置放置相同数值的无效排列数量。第一步统计每个数值的出现次数。全部不同排列数等于 n 的阶乘除以各数值出现次数的阶乘乘积。第二步枚举可能同时放在两个限制位置的数值。只有出现至少两次的数值才能形成无效排列固定这两个位置后对剩余 n-2 个元素继续使用多重集合排列公式。第三步累加所有数值对应的无效排列数并用全部排列数减去无效排列数得到答案。不同数值形成的无效集合互不重叠因此不会重复扣除。正确性说明每个不同排列要么两个限制位置数值不同并被保留要么数值相同且唯一归属于该数值对应的无效集合二者完整且互斥。边界处理所有元素相同时答案为 0所有元素互不相同时答案为 n 的阶乘。所有位置在排列计数中对称因此合法 k 的具体取值不影响计数结果。复杂度分析设不同数值数量为 d按每个候选数值重新计算剩余频次需要 O(d²) 时间频次表和阶乘计算需要 O(n) 空间。由于 n≤15结果和中间阶乘均可使用 64 位整数保存。Codefrom collections import Counter from math import factorial import sys def solve(nums: list[int], k: int) - int: n len(nums) # counts 保存每个数值可用的副本数是去除重复排列时需要除掉的对称因素。 counts Counter(nums) # n! 先把所有元素视为不同再除以每组相同元素内部可交换的 count!。 total factorial(n) for count in counts.values(): total // factorial(count) # invalid 汇总两个限制位置取相同数值的排列不同数值对应的无效集合互不重叠。 invalid 0 for value, count in counts.items(): # 该数值不足两个时不可能同时占据 k-1 和 k 两个位置。 if count 2: continue # 固定两个位置都为 value 后只需排列剩余 n-2 个元素并消除其中的重复。 ways factorial(n - 2) for other_value, other_count in counts.items(): remaining other_count - 2 if other_value value else other_count ways // factorial(remaining) invalid ways # 每个去重排列要么合法要么唯一落入某个相同数值的无效集合因此直接相减不会漏算。 return total - invalid input sys.stdin.readline # 第一行按英文逗号拆分strip 同时兼容逗号两侧可能出现的空格。 nums [int(value.strip()) for value in input().strip().split(,)] k int(input().strip()) # k 只指定两个相邻位置所有位置在排列中对称所以合法范围内的 k 不改变计数公式。 print(solve(nums, k))JSconst fs require(fs); function factorial(value) { // 15! 虽仍在 Number 安全范围内BigInt 可让阶乘与整除全程保持明确的整数语义。 let result 1n; for (let factor 2n; factor BigInt(value); factor) { result * factor; } return result; } function solve(nums, k) { const n nums.length; // counts 记录每个数值的副本数用于消除相同元素互换造成的重复排列。 const counts new Map(); for (const value of nums) { counts.set(value, (counts.get(value) || 0) 1); } // 全部不同排列数为 n! 除以各数值出现次数的阶乘乘积。 let total factorial(n); for (const count of counts.values()) { total / factorial(count); } // invalid 汇总两个限制位置数值相同的排列各候选数值的无效集合互不重叠。 let invalid 0n; for (const [value, count] of counts) { // 少于两个副本的数值无法同时占据下标 k-1 和 k。 if (count 2) { continue; } // 固定两个位置为 value 后再按剩余频次计算 n-2 个元素的去重排列数。 let ways factorial(n - 2); for (const [otherValue, otherCount] of counts) { const remaining otherCount - (otherValue value ? 2 : 0); ways / factorial(remaining); } invalid ways; } // 全部排列扣除所有无效集合后剩余结果恰好是两个位置数值不同的答案。 return total - invalid; } // 第一行按英文逗号拆分trim 兼容数字两侧存在空格的输入。 const lines fs.readFileSync(0, utf8).trim().split(/\r?\n/); const nums lines[0].split(,).map((value) Number(value.trim())); const k Number(lines[1]); // k 只选择受限相邻位置位置对称性保证合法 k 不改变计数转字符串后输出完整大整数。 console.log(solve(nums, k).toString());【华为od机试真题PythonJSJavaGo合集】【超值优惠】Py/JS/Java/Go合集【华为od机试真题Python】Python真题题库【华为od机试真题JavaScript】JavaScript真题题库【华为od机试真题JavaGo】JavaGo真题题库【华为od机试真题C】C真题题库【华为od机试真题C语言】C语言真题题库【华为od面试手撕代码题库】面试手撕代码题库【华为od机试面试交流群】【文章底部有二维码链接可扫码加交流群】华为OD机试:二本院校有机会吗? 有机会,但不大,大神除外!机考分数越高越好,所以需要提前刷题。机考通过后,如果没有收到面试邀请,也不要着急,非目标院校面试邀请发的时间比较晚。非目标院校今年有点难,机试至少要考到350分,所以需要疯狂刷题,华为OD机考是有题库的,最好在考前完所有题库题目。华为OD机试:跨专业可以参加华为OD可以,但是如果你的本科院校比较差,上岸概率不大。华为OD机试:华为OD简历被锁定机试通过,性格测试也通过,但是没人联系面试,发现简历被锁定。此时需要主动去联系HR。让他帮助你查询原因。
企业数字化 ERP 产品动态
相关推荐
Uniapp+SpringBoot即时通讯源码:跑通、改造与上架实战指南 简介:一套基于Uniapp与SpringBoot构建的即时通讯聊天安卓APP完整源码,面向移动端与Web端开发者,提供从前端界面到后端服务的全链路实现参考。资源共857个文件,压缩包约62.13MB,以Java源码(201个)… · 2026/9/26 4:11:06
千问 LeetCode 148. 排序链表 Java实现 题目分析
核心思路:归并排序。链表天然适合归并排序,不需要额外空间。
步骤:
分割:快慢指针找到中点,断开链表。递归排序:左右两半分别排序。合并:合并两个有序链表。
时间复杂度:O(… · 2026/9/26 4:11:00
一个公司有多个品牌或产品线,扫码营销要共用一套系统还是分开做? 一个公司有多个品牌或产品线,扫码营销要共用一套系统还是分开做?
太长不看版
对不少多品牌企业而言,可以优先评估“统一底层平台 品牌独立运营”的架构,而不是直接为每个品牌建设一套完全孤立的系统。
统一平台适合管理码库、用户… · 2026/9/26 4:10:40
金融科技系统设计要点:账户、对账、分布式事务与安全 1. 一片金融业务的拆解:像切蛋糕一样切出可落地的模块先说说我为什么会在这个题目上多写几句。很多刚转金融科技方向的朋友,第一反应是把"financial-services"理解成做一款理财App或者接一个支付接口,但真正进入这个领域之后你会发… · 2026/9/26 4:52:22
mingw64安装与编译实战:从C++单文件到ffmpeg4.4 简介:这是一份面向C初学者与开发者的MinGW64编译器免安装压缩包,主要解决官方渠道下载速度慢、易中断失败的问题,解压后即可直接使用,无需繁琐安装流程。包内共约2000个文件,以C标准库头文件(h、hpp&#x… · 2026/9/26 4:52:16
家庭用电预测实战:回归算法选型与特征工程避坑指南 简介:这份资源面向机器学习入门与进阶学习者,聚焦回归算法在家庭用电预测中的完整落地实践,帮助读者理解如何从数据预处理、特征工程到模型训练与评估,构建可用的用电量预测方案。压缩包共4个文件,均为Python脚本&… · 2026/9/26 4:52:10
PDI CE 8.2.0.0-11 JDBC驱动配置与三库联调实战指南 简介:本资源为Pentaho Data Integration(Kettle)开源ETL工具8.2.0社区版完整安装包,面向数据工程师、BI开发人员及ETL初学者,用于构建跨数据库的数据抽取、转换与加载流程。包内含1884个文件,以1335个核心j… · 2026/9/26 4:52:10
Java后端热部署全解析:DevTools、HotSwap与JRebel实战 大概每个写Java后端的都经历过这种崩溃瞬间:线上反馈一个字段格式不对,你打开IDEA定位到代码,改完这个if分支,然后乖乖关掉Spring Boot进程,等上十几二十秒甚至更久重启,再打开浏览器刷新验证。要是赶上依赖… · 2026/9/26 4:52:10
mingw64 安装与编译实战:从环境配置到 ffmpeg 构建 简介:这是一份面向 C 开发者与编程学习者的 MinGW-w64 编译器免安装压缩包,主要解决官方渠道下载速度慢、易中断失败的问题,解压后即可直接使用,无需繁琐安装流程,适合在 Windows 环境下搭建 C 编译与调试环境。压缩包… · 2026/9/26 4:52:10
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46