首页 > 其他分享 >栈实现队列,寻找正整数的下一个数

栈实现队列,寻找正整数的下一个数

时间:2024-12-26 23:19:18浏览次数:6  
标签:index 正整数 队列 寻找 return int numbers 大于 逆序

6.用栈模拟队列

题目

用栈来模拟一个队列,要求实现队列的两个基本操作:入队、出队。

思路

用两个栈,一个栈用来存储入队元素,另一个栈用来存储,出队元素。

比如,有两个栈A,B,入队元素,先进入到栈A,每次元素要出队时,就把栈A的元素依次出栈,进入到栈B,再从栈B出栈,来模拟元素出队。

代码

public class QueueByStack {

    private Stack<Integer> stackA = new Stack<>();
    private Stack<Integer> stackB = new Stack<>();


    /**
     * 入队
     * @param element 元素
     */
    public void enQueue(int element){
        stackA.push(element);
    }

    /**
     * 出队操作
     * @return
     */
    public Integer deQueue(){
        if(stackB.isEmpty()){
            if(stackA.isEmpty())
                throw new RuntimeException("queue is empty...");
            transfer();
        }
        return stackB.pop();
    }

    /**
     * 栈A元素转移到栈B
     */
    public void transfer(){
        while(!stackA.isEmpty())
            stackB.push(stackA.pop());
    }

    public static void main(String[] args) {
        QueueByStack queueByStack = new QueueByStack();
        queueByStack.enQueue(1);
        queueByStack.enQueue(3);
        queueByStack.enQueue(4);
        System.out.println(queueByStack.deQueue());
        System.out.println(queueByStack.deQueue());
        queueByStack.enQueue(5);
        System.out.println(queueByStack.deQueue());
        System.out.println(queueByStack.deQueue());
    }
}

7.寻找全排列的下一个数

题目

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

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

思路

由固定数字组成的数,排列的最大值,一定逆序排列,排列的最小值,一定是顺序排列。

如1,2,3,4,5,6这些数字,最大值,是654321,最小值是123456。

给定一个整数,如何找大于且仅大于当前数的新整数呢?

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

什么是逆序区域,就是我们把一个数,从最后一位往前数,数字是顺序排列的区域,就是逆序区域

比如,123654,其中654就是这个数据的逆序区域。123465,其中65就是这个数据的逆序区域。123456,其中6就是这个数的逆序区域。654321,则整体都是逆序区域,最大值,找不出大于且仅大于原数的整数了。

如何,找出123654的大于且仅大于原数的新整数呢?

我们只需要,找出逆序区域中,大于逆序区域边界前一个数中最小的数,进行交换,然后,将逆序区域,变为顺序,就是了。首先从逆序区域中,找出一个大于边界前一个数,最小的数,与之交换,是保证交换后的数,大于原数。将逆序区域,改为顺序,是为了保证,是排序后的数,大于原数的情况下最小的一个。

例如,123654,逆序区域为654,其中大于3的最小的是4,交换后,是124653,满足大于元素,但不是最小,因为653这个三位的排列,不满足最小的,需要改为顺序排列,356,所以,大于且仅大于原数的新整数,即为124356。

代码

public class NextNumber {

    public static int findNearestNumber(int number){
        int[] numbers = intToIntArray(number);
        int index = findTransferPoint(numbers);
        if(index == 0)//代表数整体都是逆序排列,是所有排列组合中最大的,无法寻找下一位
            return -1;
        exchangeHead(numbers,index);
        reverse(numbers,index);
        return intArrayToInt(numbers);
    }

    /**
     * 寻找逆序区域,注意返回的index还是属于逆序区域
     */
    private static int findTransferPoint(int[] numbers) {
        for (int i = numbers.length - 1; i > 0; i--) {//数从后往前遍历
            if (numbers[i] > numbers[i - 1])//发现后一个数大于前一个数的情况下,就是找到了逆序区域的边界
                return i;
        }
        return 0;
    }

    /**
     * 交换
     */
    private static int[] exchangeHead(int[] numbers, int index) {
        int head = numbers[index - 1];//逆序区域的前一位数
        //从后往前,第一个大于head的数,就是逆序区域中大于head的最小数,因为是逆序区域
        for (int i = numbers.length - 1; i > 0; i--) {
            if(head < numbers[i]){
                numbers[index - 1] = numbers[i];
                numbers[i] = head;
                break;
            }
        }
        return numbers;
    }

    /**
     * 将int[]数组,从index开始后的数,反转 1,2,4,6,5,3 -> 1,2,4,3,5,6
     */
    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 void main(String[] args) {
        int number = 123654;
        for(int i = 0; i < 10; i++){
            number = findNearestNumber(number);
            System.out.println(number);
        }
    }

    /**
     * int数,转成各个位构成的int[]
     */
    private static int[] intToIntArray(int number){
        String numAsString = String.valueOf(number);
        int[] digits = new int[numAsString.length()];
        for(int i = 0; i < numAsString.length(); i++)
            digits[i] = numAsString.charAt(i) - '0';//减去'0'的ASCII码值,得到数。char类型在java中可以看作是一个int的数
        return digits;
    }

    /**
     * int[],转成int
     */
    private static int intArrayToInt(int[] numbers){
        StringBuilder sb = new StringBuilder();
        for(int i : numbers)
            sb.append(i);
        return Integer.parseInt(sb.toString());
    }

}

只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。

标签:index,正整数,队列,寻找,return,int,numbers,大于,逆序
From: https://www.cnblogs.com/changming06/p/18634366

相关文章

  • 循环队列基本操作
    【问题描述】根据循环队列的类型定义,完成循环队列的基本操作。主函数中测试队列。【输入形式】一个整数m,表示入队的元素个数【输出形式】第一行:输出队头元素第二行:队列中元素依次出队以空格间隔【样例输入】5【样例输出】113579【样例输入】0【样例输出】empty!......
  • 【数据结构练习题】栈与队列
    栈与队列选择题括号匹配逆波兰表达式求值出栈入栈次序匹配最小栈设计循环队列面试题1.用队列实现栈。[OJ链接](https://leetcode.cn/problems/implement-stack-using-queues/solutions/)2.用栈实现队列。[OJ链接](https://leetcode.cn/problems/implement-queue-using-......
  • Java中使用redis作为消息队列
    Java中使用redis作为消息队列使用redis作为消息队列在Java中使用Redis作为消息队列,可以通过Redis的List​数据结构或者Pub/Sub​模式来实现。以下是一个简单的示例,展示了如何使用Redis的List​作为消息队列。1.使用Redis的List作为消息队列Redis的List​数据结构非常适合用来......
  • 数据结构-栈和队列
    栈栈是一种后进先出(LIFO)的数据结构,就像一个只允许在一端进出的管道,最后进入栈的元素最先被取出,操作主要在栈顶进行,有入栈和出栈两种操作。例如,把盘子一个个往上叠放,取盘子时从最上面开始拿,这体现了栈的特点。相关代码实现创建入栈 出栈 遍历 判空 清栈 获......
  • PTA 正整数A+B(15分)
    正整数A+B题的目标很简单,就是求两个正整数A和B的和,其中A和B都在区间[1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。输入格式:输入在一行给出A和B,其间以空格分开。问题是A和B不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱......
  • python多进程之间通讯,消息队列Queue
    代码:frommultiprocessingimportProcess,Queuedefproducer(q):myinfo="包子"q.put(myinfo)print(f"生产了{myinfo}")myinfo="饺子"q.put(myinfo)print(f"生产了{myinfo}\n")''......
  • 002. 队列安排(洛谷P1160)
    002.队列安排(洛谷P1160)题目描述一个学校里老师要将班上\(N\)个同学排成一列,同学被编号为\(1\simN\),他采取如下的方法:先将\(1\)号同学安排进队列,这时队列中只有他一个人;\(2\simN\)号同学依次入列,编号为\(i\)的同学入列方式为:老师指定编号为\(i\)的同学站在......
  • 【华为OD-E卷-最小调整顺序次数、特异性双端队列 100分(python、java、c++、js、c)】
    【华为OD-E卷-最小调整顺序次数、特异性双端队列100分(python、java、c++、js、c)】题目有一个特异性的双端队列,该队列可以从头部或尾部添加数据,但是只能从头部移出数据。小A依次执行2n个指令往队列中添加数据和移出数据。其中n个指令是添加数据(可能从头部添加、也可能从......
  • python毕设 基于Vue.js的寻找失踪人口信息平台27iqbivq程序+论文 可用于毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今社会,失踪人口问题日益严峻,给家庭和社会带来了沉重的负担。失踪人口的寻找工作不仅关乎个人安危,更关系到社会的和谐稳定。然而,传统的......
  • 二叉树的层序遍历(队列)
    给你二叉树的根节点 root ,返回其节点值的 层序遍历 。(即逐层地,从左到右访问所有节点)。 示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例2:输入:root=[1]输出:[[1]]示例3:输入:root=[]输出:[] /***Definitionforabinarytreen......