题目:有两个排序的数组A1和A2,内存在A1的末尾有足够的空间来容纳数组A2,请实现一种函数,把A2的所有数字插入到A1中并且所有的数字是排序的
//思路:设置两个索引indexofA1,indexofA2分别指向数组A1和A2的最后一个元素,即两个数组的尾部;
//比较两个索引指向的元素的大小:若indexofA1指向的元素(即A1[indexofA1])大于indexofA2指向的元素(即A2[indexofA2]),则将indexofA1指向的元素拷贝到临时数组Temp中(Temp从后往前拷贝),然后indexofA1向前移动一个位置,然后再将indexA1指向的元素与indexofA2指向的元素进行比较;若indexofA1指向的元素小于indexofA2所指向的元素,则将indexofA2指向的元素拷贝到临时数组,indexofA2--,然后再将indexA2指向的元素与indexofA1指向的元素进行比较;若indexofA1指向的元素和indexofA2指向的元素相等,则将这两个元素都拷贝到数组Temp中,然后indexofA1--,indexofA2--;以此类推,直到数组A1和A2的元素全部拷贝到数组Temp中,
最后将数组Temp中的全部元素依次复制数组A1中。这里用到了辅助内存temp[]
代码
//有两个排序的数组A1和A2,内存在A1的末尾有足够的空间来容纳数组A2,请实现一种函数,把A2的所有数字插入到A1中并且所有的数字是排序的
//思路:设置两个索引indexofA1,indexofA2分别指向数组A1和A2的最后一个元素,即两个数组的尾部;
//比较两个索引指向的元素的大小:若indexofA1指向的元素(即A1[indexofA1])大于indexofA2指向的元素(即A2[indexofA2]),
// 则将indexofA1指向的元素拷贝到临时数组Temp中,然后indexofA1向前移动一个位置,然后再将indexA1指向的元素与indexofA1指向的元素进行比较
//
// 若indexofA1指向的元素小于indexofA2所指向的元素,则将index
//
#include<iostream>
using namespace std;
#define A1length 4
#define A2length 5
void Array_Merge(int A1[],int n1,int A2[],int n2)//n1,n1分别为数组A1和A2中实际元素的数目
{
if(A1==NULL || A2==NULL || n1<=0 ||n2<=0)
{
cout<<"invalid parameter!"<<endl;
return ;
}
int totallength=n1+n2-1;
int indexofA1=n1-1;
int indexofA2=n2-1;
int *Temp=(int *)malloc(sizeof(int)*(n1+n2));
if(Temp==NULL)
{
cout<<"insufficient memory!"<<endl;
return;
}
while(indexofA1>=0 && indexofA2>=0 )//
{
if(A2[indexofA2]>A1[indexofA1])
{
Temp[totallength--]=A2[indexofA2];
indexofA2--;
}
else if(A2[indexofA2]<A1[indexofA1])
{
Temp[totallength--]=A1[indexofA1];
indexofA1--;
}
else
{
Temp[totallength--]=A1[indexofA1];
Temp[totallength--]=A2[indexofA2];
indexofA1--;
indexofA2--;
}
}
while(indexofA2>=0)//考虑A1的索引indexofA1先变为-1,此时A1的元素已经全部拷贝到数组Temp中,
//此后只需将A2的剩余元素依次拷贝到数组Temp中;
{
Temp[totallength--]=A2[indexofA2];
indexofA2--;
}
//cout<<"indexofA2:"<<indexofA2+1<<endl;
while(indexofA1>=0)//考虑A2的索引indexofA2先变为-1,此时A2的元素已经全部拷贝到数组Temp中,
//此后只需将A1的剩余元素依次拷贝到数组Temp中;
{
Temp[totallength--]=A1[indexofA1];
indexofA1--;
}
//cout<<"indexofA1:"<<indexofA1+1<<endl;
for(int i=0;i<=n1+n2-1;i++)
{
A1[i]=Temp[i];
}
}
int main(void)
{
int A1[10];
int A2[5];
int i;
cout<<"input the array A1:"<<endl;
for(i=0;i<A1length;i++)
cin>>A1[i];
cout<<"input the array A2:"<<endl;
for(i=0;i<A2length;i++)
cin>>A2[i];
Array_Merge(A1,A1length, A2,A2length);
for(i=0;i<A1length+A2length;i++)
{
cout<<A1[i]<<" ";
}
cout<<endl;
return 0;
}
分享到:
相关推荐
剑指offer面试题(7)——重建二叉树整体工程代码,C++语言实现。
实现一个栈,要求使用O(1)时间获取栈中最小值,O(1)执行pop、push操作。
剑指offer面试题66--构建乘积数组给定一个数组A[0, 1,...n - 1],请构建一个数组A[0, 1,...n - 1],其中B中的元素B[i] =
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。输入:每个输入件仅包含一组测试样例。对于每组测试案例,输入一行代表要处理的字符...
剑指offer面试题25:二叉树中和为某一数值的路径。共包含3个文件。 可运行。
剑指offer面试题3(java)
提供剑指offer 名企面试官精讲典型编程题和一套编程题的源代码。
剑指Offer面试题Python实现
牛客网剑指offer——Java题解.pdf
剑指offer的代码和思路,自己使用python语言实现的。
1、剑指解析 2、代码实现 I、剑指思路 class Solution: def extreme_insertion_index(self, nums, target, left): lo = 0 hi = len(nums) while lo target or (left and target == nums[mid]): hi = mid else...
分析:所谓“镜像”就是从镜子里看到的样子。我们可以画一棵二叉树,然后画出该二叉树的镜像。画完图之后我们会发现,所谓“二叉树的镜像”就是把二叉树中所有子树的左孩子和右孩子进行交换。因此需要遍历二叉树所有...
剑指offer的题都塞进去,大部分应该是C++.zip剑指offer的题都塞进去,大部分应该是C++.zip剑指offer的题都塞进去,大部分应该是C++.zip剑指offer的题都塞进去,大部分应该是C++.zip剑指offer的题都塞进去,大部分应该是...
面试题 6:旋转数组的最小数字(考点:查找和排序) 6 面试题 7:斐波那契数列(考点: 递归和循环) 7 面试题 8:跳台阶(考点: 递归和循环) 7 面试题 9:变态跳台阶(考点: 递归和循环) 8 面试题 10:矩形覆盖(考点...
数据结构和算法解析LeetCode解题剑指Offer面试题集.zip
剑指Offer名企面试官精讲典型编程题源代码(完整版)
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 解题...
前言2021年1月22日,我从工作超过10年的微软离职,并将于25日入职一家相对而言规模要小很多的初创公司,开始一段新的职业旅程。与所有程序员一样,换公司工作我
《剑值Offer》第一课 每天一道题,前进一小步。 二维数组中的查找 题目: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 请完成一个函数...
剑指offer面试题精选 剑指offer部分面试题使用javascript实现,配合grunt,使用karma和jasmine完成自动测试,使用jshint做代码检测。 面试题 面试题03:二维数组中的查找 面试题06:重建二叉树 面试题08:旋转数组中...