算法-----全排列

news2024/11/28 12:54:08

目录

前言

代码 

 思路

我的其他博客


前言

全排列是一种组合数学的概念,它表示将一组元素按照一定顺序进行排列的所有可能情况。在计算机编程中,通常使用递归来实现全排列。以下是使用Java语言实现全排列的详细解释:

代码 

public class Permutation {

    // 交换数组中两个元素的位置
    private static void swap(char[] array, int i, int j) {
        char temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

    // 递归生成全排列
    private static void generatePermutations(char[] array, int start, int end) {
        if (start == end) {
            // 当start等于end时,表示已经到达数组的末尾,此时输出当前排列
            System.out.println(new String(array));
        } else {
            // 对当前位置的元素和后面的元素进行交换,并递归调用生成全排列
            for (int i = start; i <= end; i++) {
                swap(array, start, i);
                generatePermutations(array, start + 1, end);
                // 恢复交换,确保下一次循环时数组的顺序是原始的
                swap(array, start, i);
            }
        }
    }

    // 生成全排列的入口函数
    public static void generatePermutations(String input) {
        if (input == null || input.length() == 0) {
            System.out.println("输入字符串为空!");
            return;
        }

        char[] array = input.toCharArray();
        generatePermutations(array, 0, array.length - 1);
    }

    public static void main(String[] args) {
        String input = "abc";
        generatePermutations(input);
    }
}

 思路

这段代码包含了两个重要的函数:swapgeneratePermutations。其中:

  • swap:用于交换数组中两个位置的元素,这是生成全排列的关键之一。

  • generatePermutations:是递归函数,它在数组中选取一个元素,然后递归调用自身生成剩余元素的全排列。这个过程中,通过不断交换元素的位置来实现不同的排列组合。

main 函数中,你可以通过调用 generatePermutations 函数并传入待排列的字符串来生成全排列。在示例中,输入字符串是 "abc"。运行程序后,你将看到所有可能的排列组合输出在控制台上。

每段代码详细讲解

public class Permutation {

    // 交换数组中两个元素的位置
    private static void swap(char[] array, int i, int j) {
        char temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
 

上面的 swap 方法用于交换数组中两个元素的位置。这是生成全排列的关键,因为在生成排列时,我们会不断交换元素的位置,以获得不同的排列组合。

    // 递归生成全排列
    private static void generatePermutations(char[] array, int start, int end) {
        if (start == end) {
            // 当start等于end时,表示已经到达数组的末尾,此时输出当前排列
            System.out.println(new String(array));
        } else {
            // 对当前位置的元素和后面的元素进行交换,并递归调用生成全排列
            for (int i = start; i <= end; i++) {
                swap(array, start, i);
                generatePermutations(array, start + 1, end);
                // 恢复交换,确保下一次循环时数组的顺序是原始的
                swap(array, start, i);
            }
        }
    }
 

generatePermutations 方法是递归生成全排列的核心部分。它接受三个参数:

  • array:代表待排列的数组。
  • start:当前要排列的起始位置。
  • end:当前要排列的结束位置。

在方法内部,首先检查是否已经到达了数组的末尾,即 start == end。如果是,表示当前排列已经完成,可以输出。否则,通过一个循环遍历当前位置及其后面的元素,不断交换元素的位置,并递归调用 generatePermutations 生成剩余元素的全排列。为了确保下一次循环时数组的顺序是原始的,需要在递归调用之后恢复交换。

    // 生成全排列的入口函数
    public static void generatePermutations(String input) {
        if (input == null || input.length() == 0) {
            System.out.println("输入字符串为空!");
            return;
        }

        char[] array = input.toCharArray();
        generatePermutations(array, 0, array.length - 1);
    }
 

 

generatePermutations 方法是生成全排列的入口函数。它接受一个字符串作为输入,将字符串转换为字符数组,并调用 generatePermutations 方法开始生成全排列。

    public static void main(String[] args) {
        String input = "abc";
        generatePermutations(input);
    }
 

main 方法中,你可以调用 generatePermutations 并传入你想要排列的字符串。在这个示例中,输入字符串是 "abc"。运行程序后,你将看到所有可能的排列组合输出在控制台上。

总体而言,这个算法使用递归和数组元素交换的方式,从头到尾地生成了所有可能的排列。通过不断改变元素的位置,它覆盖了所有可能的排列情况。

 

我的其他博客

Git命令大全:从基础到高级应用-CSDN博客

简单介绍一些其他的树-CSDN博客

什么是tomcat?tomcat是干什么用的?-CSDN博客

TCP/IP 四层体系结构-CSDN博客

Redis新数据类型-Bitmaps-CSDN博客

腾讯-轻量应用服务器centos7中宝塔安装MySQL8.0出现内存不足-CSDN博客Synchronized 优化-CSDN博客腾讯-轻量应用服务器centos7中宝塔安装MySQL8.0出现内存不足-CSDN博客

【计算机网络】URL概念及组成-CSDN博客

【计算机网络】TCP socket编程-CSDN博客

枚举类的final修饰-CSDN博客

什么是RabbitMQ-CSDN博客

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

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

相关文章

YOLOv8改进:ASF-YOLO助力小目标,提取多尺度特征| 2023年12月最新成果

🚀🚀🚀本文改进: ASF-YOLO一种新的特征融合网络架构,该网络由两个主要的组件网络组成,可以为小目标分割提供互补的信息:(1)SSFF模块,它结合了来自多尺度图像的全局或高级语义信息;(2)TFE模块,它可以捕获小目标的局部精细细节等 🚀🚀🚀YOLOv8改进专栏:http://…

邮件服务下载安装详细步骤、汉化、配置

Foxmail for Mac 下载地址&#xff1a;Download - hMailServer - Free open source email server for Microsoft Windows 教程地址 hMailServer安装使用教程 - 诸子流 - 博客园 (cnblogs.com) 设置密码为:dzqdb123 设置好端口 添加账号密码 (9条消息) hMailServer 配置DKIM…

软件测试找了两个月了,简历投了10万多次,找不到工作怎么办?

是行情不好吗&#xff1f;我觉得不是&#xff0c;为什么别人可以找到&#xff0c;而你找了两个月还找不到。 只能说明一个原因&#xff0c;你学的东西和企业需要有些差距。 现在&#xff0c;软件测试已经不是过去那样只会点点点就可以找到一个合适的工作。 首先因为大环境原…

人工智能导论复习资料

题型 1、简答题&#xff08;5题&#xff09; 2、设计题 3、综合题 4、论述题&#xff08;10分&#xff09; 考点 第一章 1、人工智能的定义、发展&#xff1b; 2、人工智能的学派、认知观及其间的关系&#xff1b; 3、人工智能要素及系统分类&#xff1b; 4、人工智能的研究、…

基于springboot实现的健身房管理系统

一、系统架构 前端&#xff1a;html | js | css | jquery | bootstrap 后端&#xff1a;springboot | springdata-jdbc 环境&#xff1a;jdk1.7 | mysql | maven 二、代码及数据库 三、功能介绍 01. 登录页 02. 管理员-首页 03. 管理员-会员卡查询 04. 管理员-会员管理…

下午好~ 我的论文【遥感】(第一期)

写在前面&#xff1a;下午浑浑噩噩&#xff0c;泡杯茶&#xff0c;读篇论文吧 首先说明&#xff0c;时间有限没有那么精力一一回复了&#xff0c;对不起各位了TAT 文章目录 遥感Bi-Dilation-formerCNN-GNN-FusionMulti-hierarchical cross transformerCoupled CNNs 遥感 Bi-D…

Linux驱动开发学习笔记4《设备树下的LED驱动实验》

目录 一、设备树LED驱动原理 二、硬件原理图分析 三、实验程序编写 1.修改设备树文件 2.LED 灯驱动程序编写 3.编写测试APP 四、运行测试 1. 编译驱动程序和测试APP &#xff08;1&#xff09; 编译驱动程序 &#xff08;2&#xff09; 编译测试APP ​ 2.运行测试 一、…

离线无网络环境下配置Python/Anaconda环境踩过的坑

一、前言 如果你同样需要在无网络环境下安装Python环境&#xff0c;这篇博客是一个很好的参考&#xff0c;由于内网没有网络&#xff0c;因此不能使用conda install/pip install等在线下载安装方式&#xff0c;经过个人尝试&#xff0c;推荐以下两种方法。 二、离线安装python…

YOLOv3-YOLOv8的一些总结

0 写在前面 这个文档主要总结YOLO系列的创新点&#xff0c;以YOLOv3为baseline。参考(抄)了不少博客&#xff0c;就自己看看吧。有些模型的trick不感兴趣就没写进来&#xff0c;核心的都写了。 YOLO系列的网络都由四个部分组成&#xff1a;Input、Backbone、Neck、Prediction…

拖拽属性 draggable

H5 新增的属性 draggable&#xff0c;它能够给与一切的 html 元素拖动的效果。 拖拽元素 属性为 draggable"true" 的元素&#xff0c;可拖动&#xff0c;且拖动时鼠标变为禁用图标 ps: 直接写 draggable 可能无效 ondragstart 开始拖拽时触发&#xff08;按下鼠标…

单机架构到分布式架构的演变

目录 1.单机架构 2.应用数据分离架构 3.应用服务集群架构 4.读写分离 / 主从分离架构 5.引入缓存 —— 冷热分离架构 6.垂直分库 7.业务拆分 —— 微服务 8.容器化引入——容器编排架构 总结 1.单机架构 初期&#xff0c;我们需要利用我们精干的技术团队&#xff0c;快…

【算法Hot100系列】盛最多水的容器

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【LeetCode】数组精选17题——双指针、滑动窗口、前缀和

目录 快慢指针&#xff1a; 1. 移动零&#xff08;简单&#xff09; 2. 复写零&#xff08;简单&#xff09; 对撞指针&#xff1a; 1. 两数之和 II - 输入有序数组&#xff08;中等&#xff09; 2. 三数之和&#xff08;中等&#xff09; 3. 有效三角形的个数&#xff…

【员工工资册】————大一期末答辩近满分作业分享

前言 大家好吖&#xff0c;欢迎来到 YY 滴项目系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C语言的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; PS&#xff1a;以下内容是部分展示&am…

全球汽车行业的数字化转型:产品和后端的渐进之旅

如何管理汽车行业的数字化转型?在我们本篇文章中了解更多有关如何设定长期目标的信息。 正在改变汽车行业的26个数字化主题 最近一篇关于汽车行业数字化转型的论文确定了26个数字技术主题&#xff08;论文详情请点击阅读原文&#xff09;&#xff0c;分为三个主要集群: 1)驾驶…

RabbitMQ手动应答与持久化

1.SleepUtil线程睡眠工具类 package com.hong.utils;/*** Description: 线程睡眠工具类* Author: hong* Date: 2023-12-16 23:10* Version: 1.0**/ public class SleepUtil {public static void sleep(int second) {try {Thread.sleep(1000*second);} catch (InterruptedExcep…

深入理解Java关键字volatile

前置知识-了解以下CPU结构 如下图所示&#xff0c;每个CPU都会有自己的一二级缓存&#xff0c;其中一级缓存分为数据缓存和指令缓存&#xff0c;这些缓存的数据都是从内存中读取的&#xff0c;而且每次都会加载一个cache line&#xff0c;关于cache line的大小可以使用命令cat…

DOS 系统(命令行)

文章目录 DOS 系统DOS 常用命令DOS 高级命令DOS 批处理命令DOS 应用场景 DOS 系统 操作系统的发展史&#xff08;DOS/Windows篇&#xff09; DOS操作系统的历史 DOS&#xff08;Disk Operating System&#xff09; 是 磁盘操作系统 的缩写&#xff0c;是一种早期的个人计算机操…

Mybatis的插件运⾏原理,如何编写⼀个插件?

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

Linux:TCP 序列号简介

文章目录 1. 前言2. 什么是 TCP 序列号&#xff1f;3. TCP 序号 的 初始值设置 和 后续变化过程3.1 三次握手 连接建立 期间 客户端 和 服务端 序号 的 变化过程3.1.1 客户端 socket 初始序号 的 建立3.1.2 服务端 socket 初始序号 的 建立3.1.3 客户端 socket 接收 服务端 SAC…