JAVA学习-练习试用Java实现“拼接最大数”

问题:


给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。

求满足该条件的最大数。结果返回一个表示该最大数的长度为 k 的数组。

说明: 请尽可能地优化你算法的时间和空间复杂度。

示例 1:

输入:
nums1 = 
[3, 4, 6, 5]

nums2 = 
[9, 1, 2, 5, 8, 3]

k = 
5

输出:
[9, 8, 6, 5, 3]
示例 2:

输入:
nums1 = 
[6, 7]

nums2 = 
[6, 0, 4]

k = 
5

输出:
[6, 7, 6, 0, 4]
示例 3:

输入:
nums1 = 
[3, 9]

nums2 = 
[8, 9]

k = 
3

输出:
[9, 8, 9]

解答思路:

以下是使用 Java 实现拼接最大数的示例代码:

import java.util.Arrays;

import java.util.Comparator;

import java.util.PriorityQueue;



class Solution {

    public int[] maxNumber(int[] nums1, int[] nums2, int k) {

        int m = nums1.length;

        int n = nums2.length;

        int[] result = new int[k];

        Arrays.fill(result, -1);



        // 从数组 nums1 中选择 i 个数字,从数组 nums2 中选择 k - i 个数字

        for (int i = Math.max(0, k - n); i <= Math.min(k, m); i++) {

            int[] subsequence1 = getMaxSubsequence(nums1, i);

            int[] subsequence2 = getMaxSubsequence(nums2, k - i);



            int[] merged = merge(subsequence1, subsequence2);



            if (isGreater(merged, result, 0, 0)) {

                System.arraycopy(merged, 0, result, 0, k);

            }

        }



        return result;

    }



    // 获取数组的最大子序列,长度为 len

    private int[] getMaxSubsequence(int[] nums, int len) {

        int[] stack = new int[len];

        int top = -1;



        for (int i = 0; i < nums.length; i++) {

            while (top >= 0 && stack[top] < nums[i] && top + nums.length - i > len) {

                top--;

            }



            if (top < len - 1) {

                stack[++top] = nums[i];

            }

        }



        return stack;

    }



    // 合并两个子序列

    private int[] merge(int[] subsequence1, int[] subsequence2) {

        int[] merged = new int[subsequence1.length + subsequence2.length];



        int i = 0, j = 0, k = 0;



        while (i < subsequence1.length && j < subsequence2.length) {

            if (subsequence1[i] > subsequence2[j]) {

                merged[k++] = subsequence1[i++];

            } else if (subsequence1[i] < subsequence2[j]) {

                merged[k++] = subsequence2[j++];

            } else {

                int p = i + 1, q = j + 1;



                while (p < subsequence1.length && q < subsequence2.length && subsequence1[p] == subsequence2[q]) {

                    p++;

                    q++;

                }



                if (q == subsequence2.length || (p < subsequence1.length && subsequence1[p] > subsequence2[q])) {

                    merged[k++] = subsequence1[i++];

                } else {

                    merged[k++] = subsequence2[j++];

                }

            }

        }



        while (i < subsequence1.length) {

            merged[k++] = subsequence1[i++];

        }



        while (j < subsequence2.length) {

            merged[k++] = subsequence2[j++];

        }



        return merged;

    }



    // 比较两个整数数组,如果 num1 更大,则返回 true,否则返回 false

    private boolean isGreater(int[] num1, int[] num2, int index1, int index2) {

        while (index1 < num1.length && index2 < num2.length) {

            if (num1[index1]!= num2[index2]) {

                return num1[index1] > num2[index2];

            }



            index1++;

            index2++;

        }



        return index1!= num1.length;

    }



    public static void main(String[] args) {

        Solution solution = new Solution();



        int[] nums1 = {3, 4, 6, 5};

        int[] nums2 = {9, 1, 2, 5, 8, 3};

        int k = 5;



        int[] result = solution.maxNumber(nums1, nums2, k);

        System.out.println(Arrays.toString(result));

    }

}

上述示例代码中,定义了一个名为'Solution'的类。'maxNumber'方法用于拼接两个数组的最大数,通过遍历从两个数组中选择不同长度的数字,得到最大子序列,并利用辅助方法'merge'、'getMaxSubsequence'和'isGreater'进行合并、获取子序列和比较。'merge'方法用于合并两个数组,利用双指针进行比较和合并。'getMaxSubsequence'方法用于获取最大子序列,通过单调栈保存当前最大数字。'isGreater'方法用于比较两个整数数组的大小。

(文章为作者在学习java过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第18天 | K近邻算法实现红酒聚类

1、实验目的 了解KNN的基本概念&#xff1b;了解如何使用MindSpore进行KNN实验。 2、K近邻算法原理介绍 K近邻算法&#xff08;K-Nearest-Neighbor, KNN&#xff09;是一种用于分类和回归的非参数统计方法&#xff0c;最初由 Cover和Hart于1968年提出(Cover等人,1967)&#…

Golang | Leetcode Golang题解之第220题存在重复元素III

题目&#xff1a; 题解&#xff1a; func getID(x, w int) int {if x > 0 {return x / w}return (x1)/w - 1 }func containsNearbyAlmostDuplicate(nums []int, k, t int) bool {mp : map[int]int{}for i, x : range nums {id : getID(x, t1)if _, has : mp[id]; has {retu…

ctfshow web sql注入 web242--web249

web242 into outfile 的使用 SELECT ... INTO OUTFILE file_name[CHARACTER SET charset_name][export_options]export_options:[{FIELDS | COLUMNS}[TERMINATED BY string]//分隔符[[OPTIONALLY] ENCLOSED BY char][ESCAPED BY char]][LINES[STARTING BY string][TERMINATED…

【三级等保】等保整体建设方案(Word原件)

建设要点目录&#xff1a; 1、系统定级与安全域 2、实施方案设计 3、安全防护体系建设规划 软件全文档&#xff0c;全方案获取方式&#xff1a;本文末个人名片直接获取。

数据结构——二叉树相关题目

1.寻找二叉树中数值为x的节点 //寻找二叉树中数值为x的节点 BTNode* TreeFind(BTNode* root, BTDataType x)//传过来二叉树的地址和根的地址&#xff0c;以及需要查找的数据 {if (root Null){return Null;}//首先需要先判断这个树是否为空&#xff0c;如果为空直接返回空if (…

基于python的数据分解-趋势-季节性-波动变化

系列文章目录 前言 时间序列数据的分解&#xff0c;一般分为趋势项&#xff0c;季节变化项和随机波动项。可以基于加法或者乘法模型。季节变化呈现出周期变化&#xff0c;因此也叫季节效应(周期&#xff09;。 一、数据分解步骤 &#xff08;1&#xff09;估计时间序列的长期…

拓扑排序,PageRank(markov),实对称矩阵等

拓扑排序 多件事情有先后顺序&#xff0c;如何判断哪个先哪个后 拓扑排序算法&#xff1a; 1.读入图时&#xff0c;需要记录每个顶点的入度&#xff0c;以及相邻的所有顶点 2.将入度为0的顶点入队&#xff08;先进先出&#xff09; 3.取出队首元素a&#xff0c;&#xf…

rocketmq-console可视化界面功能说明

rocketmq-console可视化界面功能说明 登录界面OPS(运维)Dashboard(驾驶舱)Cluster(集群)Topic(主题)Consumer(消费者)Producer(生产者)Message(消息)MessageTrace(消息轨迹) rocketmq-console是rocketmq的一款可视化工具&#xff0c;提供了mq的使用详情等功能。 本章针对于rock…

基于springboot+vue+uniapp的高校宿舍信息管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

springboot + mybatis 多数据源切换

参考的b站博主写的 配置文件: spring:datasource:db1:jdbc-url: jdbc:mysql://localhost:3306/interview_database?useUnicodetrue&characterEncodingutf-8&useSSLfalseusername: rootpassword: 12345driver-class-name: com.mysql.cj.jdbc.Driverdb2:jdbc-url: jdbc…

rancher管理多个集群

一、rancher部署 单独部署到一台机器上&#xff0c;及独立于k8s集群之外&#xff1a; 删除所有yum源&#xff0c;重新建yum源&#xff1a; # 建centos7.9的yum源 # cat CentOS-Base.repo # CentOS-Base.repo # # The mirror system uses the connecting IP address of the …

花所Flower非小号排名20名下载花所Flower

1、Flower花所介绍 Flower花所是一家新兴的数字货币交易平台&#xff0c;致力于为全球用户提供安全、便捷的交易体验。平台以其强大的技术支持和丰富的交易产品闻名&#xff0c;为用户提供多样化的数字资产交易服务&#xff0c;涵盖了主流和新兴数字货币的交易需求。 2. Flowe…

wordpress企业网站模板免费下载

大气上档次的wordpress企业模板&#xff0c;可以直接免费下载&#xff0c;连注册都不需要&#xff0c;网盘就可以直接下载&#xff0c;是不是嘎嘎给力呢 演示 https://www.jianzhanpress.com/?p5857 下载 链接: https://pan.baidu.com/s/1et7uMYd6--NJEWx-srMG1Q 提取码:…

【Python】已解决:nltk.download(‘stopwords‘) 报错问题

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;nltk.download(‘stopwords’) 报错问题 一、分析问题背景 在使用Python的自然语言处理库NLTK&#xff08;Natural Language Toolkit&#xff09;时&#xff0c…

《向量数据库指南》——Milvus Cloud检索器增强的深度探讨:句子窗口检索与元数据过滤

检索器增强的深度探讨&#xff1a;句子窗口检索与元数据过滤 在信息爆炸的时代&#xff0c;高效的检索系统成为了连接用户与海量数据的关键桥梁。为了进一步提升检索的准确性和用户满意度&#xff0c;检索器增强技术应运而生&#xff0c;其中句子窗口检索与元数据过滤作为两大…

每日一题~oj(贪心)

对于位置 i来说&#xff0c;如果 不选她&#xff0c;那她的贡献是 vali-1 *2&#xff0c;如果选他 &#xff0c;那么她的贡献是 ai. 每一个数的贡献 是基于前一个数的贡献 来计算的。只要保证这个数的前一个数的贡献是最优的&#xff0c;那么以此类推下去&#xff0c;整体的val…

基于自编码器的时间序列异常检测方法(以传感器数据为例,MATLAB R2021b)

尽管近年来研究者对自编码器及其改进算法进行了深入研究&#xff0c;但现阶段仍存在以下问题亟须解决。 1) 无监督学习模式对特征提取能力的限制与有监督学习相比&#xff0c;无监督学习模式摆脱了对样本标签的依赖、避免了人工标注的困难&#xff0c;但也因此失去了样本标签的…

vue3+vite搭建第一个cesium项目详细步骤及环境配置(附源码)

文章目录 1.创建vuevite项目2.安装 Cesium2.1 安装cesium2.2 安装vite-plugin-cesium插件&#xff08;非必选&#xff09;2.3 新建组件页面map.vue2.4 加载地图 3.完成效果图 1.创建vuevite项目 打开cmd窗口执行以下命令&#xff1a;cesium-vue-app是你的项目名称 npm create…

Zkeys三方登录模块支持QQ、支付宝登录

1&#xff0c;覆盖到根目录&#xff0c;并导入update.sql数据库文件到Zkeys数据库里 2. 后台系统权限管理&#xff0c;配置管理员权限-系统类别-找到云外科技&#xff0c;全部打勾 3&#xff0c;后台系统设置找到云外快捷登录模块填写相应的插件授权配置和登录权限配置&#x…

【wordpress教程】wordpress博客网站添加非法关键词拦截

有的网站经常被恶意搜索&#xff0c;站长们不胜其烦。那我们如何屏蔽恶意搜索关键词呢&#xff1f;下面就随小编一起来解决这个问题吧。 后台设置预览图&#xff1a; 设置教程&#xff1a; 1、把以下代码添加至当前主题的 functions.php 文件中&#xff1a; add_action(admi…