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

【华为OD题库-106】全排列-java

题目

给定一个只包含大写英文字母的字符串S,要求你给出对S重新排列的所有不相同的排列数。如:S为ABA,则不同的排列有ABA、AAB、BAA三种。
解答要求
时间限制:5000ms,内存限制:100MB
输入描述
输入一个长度不超过10的字符串S,确保都是大写的。
输出描述
输出S重新排列的所有不相同的排列数(包含自己本身)。
示例1:
输入
ABA
输出
3
示例2:
输入
ABCDEFGHHA
输出
907200

思路

求含重复元素的排列总数,两种方法(数学法效率远高于dfs):

  1. dfs列举所有排列,得到总数,只需要总数,不需要具体组合,具体思路详见:【JAVA-排列组合】一个套路速解排列组合题
  2. 数学公式法

比如输入数据为:ABCDDDA
不考虑重复数据,总的排列数为:res=7!
统计重复元素出现次数:A出现2次,D出现3次,其他出现1次
所以最后结果为:res=7!/(2!*3!)=420

备注:数学法可以这样理解,不考虑重复,那么n个元素的排列方法为n!,再去重,比如某个元素有3个,在不去重时,它重复了3!次,去重时直接除掉它就可以了

题解

package hwod;import java.util.*;public class ArrangeInOrder {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str = sc.nextLine();System.out.println(arrangeInOrder(str));System.out.println(arrangeInOrder2(str));}private static int res;private static int arrangeInOrder(String str) {final char[] chars = str.toCharArray();Arrays.sort(chars);int[] used = new int[chars.length];dfs(chars, used, 0);return res;}private static void dfs(char[] chars, int[] used, int len) {if (len == chars.length - 1) {//确定到倒数第二位即可res++;return;}for (int i = 0; i < chars.length; i++) {if (i > 0 && chars[i] == chars[i - 1] && used[i - 1] == 0) continue;if (used[i] == 1) continue;used[i] = 1;dfs(chars, used, len + 1);used[i] = 0;}}//方案二:数学法private static int arrangeInOrder2(String str) {Map<Character, Integer> map = statisticsCnt(str);int size = str.length();long res = getFactorialNum(size);int divide = 1;for (Character key : map.keySet()) {divide *= getFactorialNum(map.get(key));}return (int) (res / divide);}private static Map<Character, Integer> statisticsCnt(String string) {Map<Character, Integer> map = new HashMap<>();for (int i = 0; i < string.length(); i++) {map.put(string.charAt(i), map.getOrDefault(string.charAt(i), 0) + 1);}return map;}/*** @param n* @return 计算阶乘*/private static long getFactorialNum(long n) {if (n == 1) return 1;return n * getFactorialNum(n - 1);}
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

说明

本专栏所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_31076523/article/details/134176793。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

相关文章:

  • Hadoop 集群环境搭建
  • Pooling方法总结(语音识别)
  • Farad capacitor法拉电容为什么又称Super capacitor超级电容?
  • 2024最新软件测试面试题(带答案)
  • 【数据结构之顺序表】
  • 掌握Jenknis基础概念
  • 【华为机试】2023年真题B卷(python)-乘坐保密电梯
  • 持续集成交付CICD:HELM 自动化完成前端项目应用发布与回滚
  • HBase基础知识(二):HBase集群部署、HBaseShell操作
  • Linux的/proc/self/学习
  • Starting the Docker Engine...一直转圈
  • 中国人民大学金融加拿大女王大学硕士项目——你愿意花一年时间完成蜕变吗
  • SAP系统标准表之间的关联关系对应
  • 职场遇到瓶颈如何破解?不妨看看中国人民大学金融加拿大女王大学硕士项目
  • 微信商家0.2费率如何申请
  • Android开源项目规范总结
  • Angular4 模板式表单用法以及验证
  • ERLANG 网工修炼笔记 ---- UDP
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • input的行数自动增减
  • js算法-归并排序(merge_sort)
  • Material Design
  • React-生命周期杂记
  • select2 取值 遍历 设置默认值
  • springboot_database项目介绍
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • 判断客户端类型,Android,iOS,PC
  • 使用common-codec进行md5加密
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 原生Ajax
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #pragma 指令
  • #每天一道面试题# 什么是MySQL的回表查询
  • (04)odoo视图操作
  • (a /b)*c的值
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (一)认识微服务
  • (转)JAVA中的堆栈
  • ***原理与防范
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .gitignore文件—git忽略文件
  • .net framework 4.0中如何 输出 form 的name属性。
  • .Net7 环境安装配置
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • /etc/skel 目录作用
  • /var/lib/dpkg/lock 锁定问题
  • @Conditional注解详解
  • [autojs]autojs开关按钮的简单使用
  • [C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计
  • [EULAR文摘] 利用蛋白组学技术开发一项蛋白评分用于预测TNFi疗效
  • [HNOI2018]排列