找到小于等于n且满足规则的最大数

本文介绍了一种算法,用于找到小于等于给定数n的最大数x,其中x的每位数字从左到右单调不减。通过使用双栈结构,算法能够有效地处理列表中的整数,确保最终结果满足题目要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

输入一个数n,找出小于等于n且满足一下规则的最大的数x。
规则:x中的从左到右的每一位都是单调不减的。

 

    public static void main(String[] args) {
            List<Integer> list = new ArrayList<Integer>();
            list.add(6);
            list.add(7);
            list.add(4);
            list.add(8);
            list.add(2);
            list.add(9);

            String result3 = solution(list);

            System.out.println(result);

        }

        public static String solution(List<Integer> list){
            //判空

            LinkedList<Integer> stack1 = new LinkedList<Integer>();
            LinkedList<Integer> stack2 = new LinkedList<Integer>();
            for(int i = 0; i < list.size(); i++){
                //排除数字开始是0的情况
                if(list.get(i) == 0){
                    stack1.clear();
                    continue;
                }

                stack2.push(list.get(i));
                while(!stack1.isEmpty() && stack1.peek() > list.get(i)){
                    stack1.pop();
                    stack2.push(list.get(i));
                }

                while(!stack2.isEmpty()){
                    stack1.push(stack2.pop());
                }
            }

            StringBuilder sb = new StringBuilder();
            while(!stack1.isEmpty()){
                sb.append(stack1.pop());
            }

            return sb.reverse().toString();
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值