前几天看见一道面试题中要将两个有序数组合并成一个新的有序数组,首先使用了嵌套循环,之后想那样效率太低,又想出了以下思路,和大家分享下,如果有更好的方法,请留言指教:

思路:
 1.新建一个数组大小为firArr和secArr之和的数组mergeArr
 2.如果fistArr的第一个元素大于等于secArr的最后一个元素,则直接对mergeArr进行元素赋值
 3.如果secArr的第一个元素大于secArr的最后一个元素,则直接对mergeArr进行元素赋值
 4.若不满足上面两种情况,则需要进行数组拆分

  1)设置数组firArr和数组secArr的索引index,初始值都为0

  2)循环mergeArr数组

  3)如果当前firArr的索引小于firArr数组大小且secArr的索引小于secArr数组的大小,判断firArr、secArr两数组对应位置的元素大小,将值小的数组的那个值赋值给mergeArr,并向后移动一位此数组的index
  4)如果当前位置小于firArr或者secArr两数组的大小,进行相应的复制(走到这个循环中,只能表示说,有一个数组已经索引完毕了)

代码如下:

package com.hudai.platform.manager;

import java.util.Arrays;

/**
* 算法测试 合并两个有序数组到一个数组中
*
* @author WanHongLei
* @version 创建时间:2019年2月13日 上午11:14:13 类说明
*/
public class MergeTester { public static void main(String[] args) throws Exception {
int[] a = { 1, 2, 2, 3, 4, 5 };
int[] b = { 5, 7, 9, 13 }; System.out.println(Arrays.toString(mergeArr(a, b))); } /**
* 思路: 1.新建一个数组大小为firArr和secArr之和的数组mergeArr
* 2.如果fistArr的第一个元素大于等于secArr的最后一个元素,则直接对mergeArr进行元素赋值
* 3.如果secArr的第一个元素大于secArr的最后一个元素,则直接对mergeArr进行元素赋值
* 4.若不满足上面两种情况,则需要进行数组拆分
* 1)设置数组firArr和数组secArr的索引index,初始值都为0
* 2)循环mergeArr数组
* 3)如果当前firArr的索引小于firArr数组大小且secArr的索引小于secArr数组的大小,判断firArr、secArr两数组对应位置的元素大小,将值小的数组的那个值赋值给mergeArr,并向后移动一位此数组的index
* 4)如果当前位置小于firArr或者secArr两数组的大小,进行相应的复制(走到这个循环中,只能表示说,有一个数组已经索引完毕了)
*
* @param firArr
* 第一个数组
* @param secArr
* 第二个数组
* @return 合并之后的数组
*/
private static int[] mergeArr(int[] firArr, int[] secArr) {
int firlen = firArr.length;
int seclen = secArr.length;
int[] mergeArr = new int[firlen + seclen]; if (firArr[0] >= secArr[seclen - 1]) {
for (int i = 0; i < mergeArr.length; i++) {
if (i < seclen) {
mergeArr[i] = secArr[i];
} else {
mergeArr[i] = firArr[i - seclen];
}
}
} else if (secArr[0] >= firArr[firlen - 1]) {
for (int i = 0; i < mergeArr.length; i++) {
if (i < firlen) {
mergeArr[i] = firArr[i];
} else {
mergeArr[i] = secArr[i - firlen];
}
}
} else {
int indexFir = 0, indexSec = 0;
for (int i = 0; i < mergeArr.length; i++) {
if(indexFir < firlen && indexSec < seclen){
if (firArr[indexFir] > secArr[indexSec]) {
mergeArr[i] = secArr[indexSec];
indexSec++;
} else if (firArr[indexFir] < secArr[indexSec]) {
mergeArr[i] = firArr[indexFir];
indexFir++;
}
}else if(indexFir < firlen){
mergeArr[i] = firArr[indexFir];
indexFir++;
}else if(indexSec < seclen){
mergeArr[i] = secArr[indexSec];
indexSec++;
}
}
} return mergeArr;
} }

java合并两个有序数组的算法(抛砖引玉)的更多相关文章

  1. 算法练习之x的平方根,爬楼梯,删除排序链表中的重复元素, 合并两个有序数组

    1.x的平方根 java (1)直接使用函数 class Solution { public int mySqrt(int x) { int rs = 0; rs = (int)Math.sqrt(x ...

  2. Java实现 LeetCode 88 合并两个有序数组

    88. 合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元 ...

  3. leetcode-只出现一次的数字合并两个有序数组

    题目:合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素 ...

  4. python3实现合并两个有序数组

    很早就听同学和师兄经常说刷题很重要,然而编程能力一直都很渣的我最近才开始从leetcode的初级算法开始.今天遇到的这道题虽然很简单,因为是头一次用自己的方法速度还不错,特此记录一下,还大神们请不要嘲 ...

  5. 每日一道 LeetCode (19):合并两个有序数组

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  6. 合并两个有序数组a和b到c

    问题:两个有序数组a和b,合并成一个有序数组c. // 合并两个有序数组a和b到c void Merge_Array(int a[], int n, int b[], int m, int c[]) ...

  7. Leetcode#88. Merge Sorted Array(合并两个有序数组)

    题目描述 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ...

  8. 【leetcode-88,21】 合并两个有序数组/链表

    合并两个有序数组 (easy,1过) 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nu ...

  9. Leetcode 88 合并两个有序数组 Python

    合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分 ...

随机推荐

  1. 内置函数系列之 filter

    filter 过滤 基本语法: s = filter(function,iterable) 将可迭代对象的每一个元素,传进函数中,根据函数中的判断条件,返回True或False 返回True的是保留的 ...

  2. 第三课:PHP 语法

    PHP 脚本在服务器上执行,然后向浏览器发送回纯 HTML 结果. 基础 PHP 语法 PHP 脚本可放置于文档中的任何位置. PHP 脚本以 <?php 开头,以 ?> 结尾: < ...

  3. jupyter notebook中出现ValueError: signal only works in main thread 报错 即 长时间in[*] 解决办法

    我在jupyter notebook中新建了一个基于py3.6的kernel用来进行tensorflow学习 但是在jupyter notebook中建立该kernel时,右上角总是显示 服务正在启动 ...

  4. Poweroj:2425-跳台阶(经典递推)

    题目链接:https://www.oj.swust.edu.cn/problem/show/2425 跳台阶 Edit Manage Data Rejudge Time Limit: 1000 MS ...

  5. B-树 动机与结构

    Ps.我们遵循从感性到理性的认知顺序来逐步探索B-树的奥秘,之前经常说的value这里用key(关键码)指代,因为可能存的是字符串,说是value就不合适了. (多图预警!!!建议在WI-FI下观看) ...

  6. HDFS HA(High Availability)高可用性

    HDFS HA(High Availability)高可用性 参考文献: 官方文档 全文翻译 Hadoop组件之-HDFS(HA实现细节) 这张图片的个人理解 由于NameNode在Hadoop1只有 ...

  7. idea push reject:push mater to origin/master was rejected by remote

    用idea commit之后,执行push操作,总是提示push reject:push mater to origin/master was rejected by remote,如下图 上网说执行 ...

  8. 关于原生JS获取class,ID等属性的一些封装

    一.传统上获取是通过document.getElementById获取元素的ID属性,通过总结与学习总结一下获取元素class以及id属性的一些封装; 1.创建构造函数,这里面不需要多解释什么:(主要 ...

  9. 十二、mysql之视图,触发器,事务等

    一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  10. powershell设置SS代理

    $env:HTTPS_PROXY="http://127.0.0.1:1080" $env:HTTP_PROXY="http://127.0.0.1:1080"