数据结构---寻找一个整数所有数字全排列的下一个数

news2024/12/23 19:41:19

寻找一个整数所有数字全排列的下一个数

  • 储备知识
  • 第一步
  • 第二步
  • 第三步
  • JAVA实现

给出一个正整数,找出这个正整数所有数字全排列的下一个数。说通俗点就是在一个整数所包含数字的全部组合中,找到一个大于且仅大于原数的新整数。

例子:
如果输入12345,则返回12354。
如果输入12354,则返回12435。
如果输入12435,则返回12453。

为了和原数接近,我们需要尽量保持高位不变,低位在最小的范围内变换顺序。
变换顺序的范围大小,则取决于当前整数的逆序区域。

在这里插入图片描述
12354的逆序区域是最后两位,仅看这两位已经是当前的最大组合。
若想最接近原数,又比原数更大,必须从倒数第3位开始改变。

具体操作:我们需要从后面的逆序区域中找到大于3的最小的数字,让其和3的位置进行互换。
在这里插入图片描述
倒数第3位已经确定,这个时候最后两位仍然是逆序状态。我们需要把最后两位转变为顺序状态,以此保证在倒数第3位数值为4的情况下,后两位尽可能小
在这里插入图片描述

储备知识

如果是固定的几个数字,应该是在逆序排列的情况下最大,在顺序排列的情况下最小。
数字的顺序和逆序,是全排列中的两种极端情况。
为了和原数接近,我们需要尽量保持高位不变,低位在最小的范围内变换顺序
变换顺序的范围大小,则取决于当前整数的逆序区域。

第一步

从后向前查看逆序区域,找到逆序区域的前一位,也就是数字置换的边界

第二步

让逆序区域的前一位和逆序区域中大于它的最小的数字交换位置。

第三步

把原来的逆序区域转为顺序状态

JAVA实现

package algorithmProblem;

import java.util.Arrays;

public class nextNumberOfTheFullArrangement {

    //找数字置换的边界***************
    private static int findTransformerPoint(int[] number){
        for (int i=  number.length-1;i>0;i--){
            if(number[i]>number[i-1]){
                return i;
            }
        }
        //说明数组已经逆序
        return 0;
    }
    //把逆序区域的前一位和逆序区域中刚刚大于它的数字交换位置
    private static int[] exchangeHead(int[] number,int index){
        //逆序区域的前一位:index-1
        int head = number[index-1];
        for (int i =number.length-1;i>0;i--){
            if(head<number[i]){
                number[index-1] = number[i];
                number[i]=head;
                break;
            }
        }
        //交换元素后的数组
        return number;
    }

    //把原来的逆序区域转为顺序
    private static int[] reverse(int[]num,int index){
        for (int i = index,j=num.length-1;i<j;i++,j--){
            int temp = num[i];
            num[i] = num[j];
            num[j]=  temp;
        }
        return num;
    }

    //传入是一个数组,得到结果再用数组输出
    public static int[] findNearestNumber(int[] number){
        //1. 从后向前查看逆序区域,***找到逆序区域的前一位***,也就是数字置换的边界
        int index = findTransformerPoint(number);
        // 如果数字置换边界是0,说明整个数组已经逆序,无法得到更大的相同数
        if(index==0){
            return null;
        }
        //2.把逆序区域的前一位和逆序区域中刚刚大于它的数字交换位置
        //先复制一份
        int[] numberCopy = Arrays.copyOf(number,number.length);
        exchangeHead(numberCopy,index);
        //把原来的逆序区域转为顺序
        reverse(numberCopy,index);
        return numberCopy;
    }

    private static void output(int[] number){
        for (int i:number){
            System.out.print(i);
        }
        System.out.println();
    }

    
}

特别关注逆序区域的划分

测试类

public static void main(String[] args) {
        int[]a = new int[]{1,2,4,3,5};
        int[] newa=new int[]{};
        newa= findNearestNumber(a);
        output(newa);
        System.out.println("打印当前数组之后的10个全排列整数");

        //打印12345 之后的10个全排列整数
        for (int i = 0;i<10;i++){
            a = findNearestNumber(a);
            output(a);
        }
    }

在这里插入图片描述

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

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

相关文章

【翻译】GPT-3是如何工作的

前排提示 这是我补充的内容&#xff0c;仅代表个人观点&#xff0c;和作者本人无关。 主要是意译我的补充&#xff0c;想看原文表达的拖到最底下有链接。 原文翻译 在科技界我们可以看到很多关于GPT-3的新闻。大型语言模型&#xff08;比如GPT-3&#xff09;已经展示出让我们惊…

[附源码]Python计算机毕业设计Django现代诗歌交流平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

一篇ThreadLocal走天下

尺有所短&#xff0c;寸有所长&#xff1b;不忘初心&#xff0c;方得始终。 请关注公众号&#xff1a;星河之码 在面试的时候经常会有人文ThreadLocal是啥&#xff0c;首先明确的一点是&#xff1a;虽然ThreadLocal提供了一种解决多线程环境下成员变量的问题&#xff0c;但是Th…

SSM框架学习记录-SpringMVC_day01

1.SpringMVC概述 SpringMVC功能与优点 SpringMVC是一种基于Java实现MVC模型的轻量级Web框架 SpringMVC技术与Servlet技术功能一样(对Servlet进行了封装)&#xff0c;都属于Web层开发技术 SpringMVC的主要的作用就是用来接收前端发过来的请求和数据然后经过处理并将处理的结果…

自定义注解实现参数校验

个人博客地址&#xff1a; http://xiaohe-blog.top/ 文章目录1. 为什么要进行参数校验2. 如何实现参数校验3. 注解实现参数校验4. 自定义注解实现参数校验1. 为什么要进行参数校验 在后端进行工作时&#xff0c;需要接收前端传来的数据去数据库查询&#xff0c;但是如果有些数…

目前智慧工厂建设面临的急需解决的问题有哪些?

当前国内诸多制造业企业面临着巨大的转型压力。一方面&#xff0c;劳动力成本迅速攀升、产能过剩、竞争激烈、客户个性化需求日益增长等因素&#xff0c;迫使制造企业从低成本竞争策略转向建立差异化竞争优势。具体在工厂层面&#xff0c;制造企业面临着招工难&#xff0c;以及…

去应聘测试管理职位时遇到的面试题

前言&#xff1a; 在测试管理的路上&#xff0c;少不了招聘测试管理的测试人员&#xff0c;或自己去应聘测试管理人员的时候&#xff0c;因此梳理了关于测试管理职位的面试题&#xff1a; 1、请你列举你曾经担任的测试工作职位&#xff1f; 2、你认为项目测试经理的工作职责和…

简单个人网页设计作业 静态HTML个人博客主页 DW个人网站模板下载 大学生简单个人网页作品代码 个人网页制作 学生个人网页设计作业

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

【印刷字符识别】OCR键盘数字+字母识别【含Matlab源码 807期】

⛄一、OCR简介 1 什么是OCR技术&#xff1f; OCR英文全称是Optical Character Recognition&#xff0c;中文叫做光学字符识别。它是利用光学技术和计算机技术把印在或写在纸上的文字读取出来&#xff0c;并转换成一种计算机能够接受、人又可以理解的格式。文字识别是计算机视觉…

Java项目:SSM服装出租服装店租赁服装管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目为后台管理系统&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,用户管理,公告管理,服装类型管理,服装信息管理,客户信息管…

计算机毕设Python+Vue新生报到管理(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Java项目:SSM在线甜品商城平台

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 管理员角色包含以下功能&#xff1a; 管理员登录,套餐管理,甜品管理,预定管理等功能。 用户角色包含以下功能&#xff1a; 用户登录与注册,查看…

Activiti7-流程变量

流程变量 流程变量的作用域 设置流程定义的key为myEvection2 使用流程变量 定义好流程变量后&#xff0c;就可以在整个流程定义中使用这些流程变量了。例如可以在某些任务属性如 assignee上使用${assignee}&#xff0c;或者在某些连线上使用${day<3}。 Activiti中可以使用…

C语言初阶_初识C语言(2)

我尝试用这博客记录下我所热爱 ​我只不过是个无名小辈 ​无休止地更新 ​在名利中苦苦挣扎 ​世事变幻莫测 ​就算每一次早早被淘汰 ​在失败边缘挣扎 我的数据结构与算法系列开始了&#xff0c;有一定C语言基础的同学可以去学习&#xff01; 数据结构与算法_时间复杂度 有…

jmeter下载及安装配置

目录&#xff1a;导读 前言 jmeter环境 jmeter环境变量配置如下&#xff1a; &#xff08;1&#xff09;新增JMETER_HOME变量 &#xff08;2&#xff09;配置Path环境变量&#xff1a; &#xff08;3&#xff09;配置CLASSPATH变量&#xff0c;加上&#xff1a; &#xf…

计算机毕业设计——基于html智能家电购物商城项目的设计与实现

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

【SpringMVC】使用篇:SpringMVC的开始

目录 一、前言 二、RequestMapping 三、params表达式 四、Ant风格资源地址 五、PathVariable 六、Rest风格的请求数据 七、请求映射数据 相关文章 【SpringMVC】入门篇&#xff1a;带你了解SpringMVC的执行流程【SpringMVC】入门篇&#xff1a;带你了解SpringMVC的执行流程一、…

使用MMA解决拓扑优化问题的并行框架

使用MMA解决拓扑优化问题的并行框架 仅个人论文学习笔记。 本文的重点是用c实现的完全并行拓扑优化框架&#xff08;线性求解器和优化算法&#xff09;&#xff0c;将MMA(Method of Moving Asymptotes)优化算法并行化&#xff0c;作为代码的基本部分。 实现一个拓扑优化问题 在…

vitepress+gitee pages搭建自己的博客网站

概述 “不写博客的GISer不是一个好程序员”。所以&#xff0c;好多程序员会保留着写博客的习惯&#xff0c;一方面记录自己的学习成果或者解决某个问题的方法&#xff0c;一方面能够帮助到他人&#xff0c;再一方面也能够督促自己多学点东西……这是一个一举N得的事情。上为其…

【C语言进阶】怎么可能不会?十分钟带你玩转枚举与联合

目录 &#x1f34a;前言&#x1f34a;&#xff1a; &#x1f95d;一、枚举&#x1f95d;&#xff1a; 1.枚举类型的定义&#xff1a; 2.枚举类型的优点&#xff1a; 3.枚举类型的使用&#xff1a; &#x1f353;二、联合&#xff08;共用体&#xff09;&#x1f353;&#x…