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

思路:
 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. CI 框架源码解析一之入口文件 index.php

    Index.php作为CI框架的入口文件,源码分析,自然而然由此开始.在源码分析的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现,如果英文水平很好的话,读过index.php文件的英文注释之 ...

  2. LInux操作随手笔记

    一.find 的用法 实例 find / -name test.txt 就可以找到这个文件的路径(如果存在). 二.学用vi编辑器,学用rz往linux服务器上面上传文件 linux中rz 和 sz ...

  3. stark组件(11):组合搜索

    效果图: 新增函数和类 Option 获取字段的对象或元组 SearchGroupRow 封装数据,展示到前端 get_search_group 获取组合搜索的字段 get_search_group_ ...

  4. 华为模拟器ensp代码错误2,41,40问题的解决

    win8+ensp320 ensp这是个神奇的软件,问题竟然出现的这么莫名其妙..前一秒还是好的时候,后一秒就立马出现了问题.不过不要慌...沉住气,把这篇文章看下去. 博主从昨天开始,ensp神奇的 ...

  5. python——int()函数

    1. 使用 int() 将小数转换为整数,结果是向上取整还是向下取整呢? 小数取整会采用比较暴力的截断方式,即向下取整.(注:5.5向上取整为6,向下取整为5) 2. 我们人类思维是习惯于“四舍五入” ...

  6. 4525: [Cerc2012]Kingdoms

    4525: [Cerc2012]Kingdoms 题意 n个国家,两两之间可能存在欠债或者被欠债的关系,一个国家破产:其支出大于收入.问一个国家能否坚持到最后. 思路 很有意思的一道题. dp[s]表 ...

  7. Hihocoder 1275 扫地机器人 计算几何

    题意: 有一个房间的形状是多边形,而且每条边都平行于坐标轴,按顺时针给出多边形的顶点坐标 还有一个正方形的扫地机器人,机器人只可以上下左右移动,不可以旋转 问机器人移动的区域能不能覆盖整个房间 分析: ...

  8. mysql 中的基本用法,以及日期的转换

    1.mysql int(10) int 类型长度4个字节,大约表示2^32数字,10代表的是显示长度,一般和FILLZERO约束一起使用,如果没有达到该长度,填充02-->000000002 m ...

  9. Java从后台重定向(redirect)到另一个项目的方法

    (1)通过ModelAndView跳转 @RequestMapping("alipayforward") public ModelAndView alipayforward(Htt ...

  10. 《Cracking the Coding Interview》——第13章:C和C++——题目3

    2014-04-25 19:42 题目:C++中虚函数的工作原理? 解法:虚函数表?细节呢?要是懂汇编我就能钻的再深点了.我试着写了点测大小.打印指针地址之类的代码,能起点管中窥豹的作用,从编译器的外 ...