首页 > 试题广场 >

整型数组合并

[编程题]整型数组合并
  • 热度指数:123938 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

题目标题:

将两个整型数组按照升序合并,并且过滤掉重复数组元素。
输出时相邻两数之间没有空格。




输入描述:

输入说明,按下列顺序输入:
1 输入第一个数组的个数
2 输入第一个数组的数值
3 输入第二个数组的个数
4 输入第二个数组的数值



输出描述:

输出合并之后的数组

示例1

输入

3
1 2 5
4
-1 0 3 2

输出

-101235
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int compare_func(int *a,int *b)
{
    return *a > *b;
}

int main() {
    int* pArrA = 0;
    int* pArrB = 0;
    int* pArrOut = 0;

    int cntA = 0;
    int cntB = 0;

    scanf("%d", &cntA);
    pArrA = malloc(sizeof(int) * cntA);
    for (int i = 0; i < cntA; i++) {
        scanf("%d", pArrA + i);
    }

    scanf("%d", &cntB);
    pArrB = malloc(sizeof(int) * cntB);
    for (int i = 0; i < cntB; i++) {
        scanf("%d", pArrB + i);
    }

    int cntOut = cntA+cntB;
    pArrOut = malloc(sizeof(int)*cntOut);
    
    memcpy(pArrOut, pArrA, sizeof(int)*cntA);
    memcpy((char *)pArrOut + sizeof(int)*cntA, pArrB, sizeof(int)*cntB);

    qsort(pArrOut, cntOut, sizeof(int), compare_func);

    int val = *(pArrOut);
    printf("%d", val);
    for(int i=1;i<cntOut;i++){
        if(*(pArrOut + i) != val){
            printf("%d", *(pArrOut + i));
            val = *(pArrOut + i);
        }
    }
    return 0;
}

编辑于 2024-03-29 09:54:42 回复(0)
#include <stdio.h>
#include <stdlib.h>

int main() {
    int n;
    scanf("%d", &n);
    int Arr1[n];
    for (int i = 0; i < n; i++) {
        scanf("%d", &Arr1[i]);
    }

    int m;
    scanf("%d", &m);
    int Arr2[m];
    for (int i = 0; i < m; i++) {
        scanf("%d", &Arr2[i]);
    }

    // 合并数组
    int resultSize = n + m;
    int* result = (int*)calloc(resultSize, sizeof(int));

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

    while (i < n && j < m) {
        if (Arr1[i] < Arr2[j]) {
            result[k++] = Arr1[i++];
        } else if (Arr1[i] > Arr2[j]) {
            result[k++] = Arr2[j++];
        } else {
            // 如果两个元素相等,则只放入一个,并同时更新数组
            result[k++] = Arr1[i++];
            j++;
        }
    }

    // 将剩余的元素放入result中
    while (i < n) {
        result[k++] = Arr1[i++];
    }

    while (j < m) {
        result[k++] = Arr2[j++];
    }
    // 去重
    for(int idx=0;idx<resultSize;idx++){
        printf("%d",result[idx]);
    }
    free(result);
    return 0;
}
各位友友们 为什么我这个代码总有两个用例通不过
发表于 2024-01-23 16:44:39 回复(0)
#include <stdio.h>
#include<stdlib.h>
int comp(const void*a,const void*b)        //用来做比较的函数。
{
    return *(int*)a-*(int*)b;
}
int main() {
    int m,n,a[1000] = {0},i = 0;
    scanf("%d",&m);
    for(i = 0; i<m; i++)scanf("%d",&a[i]);
    scanf("%d",&n);
    for(; i<m+n; i++)scanf("%d",&a[i]);
    qsort(a,n+m,sizeof(int),comp);           //调用qsort排序
    for(int i = 0, temp = 0; i<m+n; i++){
        if(a[i] != temp)printf("%d",a[i]),temp = a[i];
    }
    return 0;
}

编辑于 2023-12-03 20:53:11 回复(0)
#include <stdio.h>
#include <stdlib.h>

//先对数组升序排序
void BubbleSort(int arr[],int n)
{
    for(int i = 0;i<n-1;i++)
    {
        for(int j = 0;j<n-1-i;j++)
        {
            if(arr[j]>arr[j+1])
            {
                int tmp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = tmp;
            }
        }
    }
}
//删除排序后重复的数据
int erase(int arr[],int n)
{
    for(int i = 0;i<n-1;)
    {
        if(arr[i] == arr[i+1])
        {
            for(int j = i;j<n-1;j++)
            {
                arr[j] = arr[j+1];
            }
            n--;
        }
        i++;
    }
    return n;
}

int main() {
    int n1 = 0;
    int n2 = 0;
    scanf("%d",&n1);
    int* num1 = (int*)malloc(sizeof(int)*n1);
    if(num1 == NULL)
    {
        printf("malloc fail\n");
        exit(-1);
    }
    for(int i = 0;i<n1;i++)
    {
        scanf("%d",&num1[i]);
    }
    scanf("%d",&n2);
    int* num2 = (int*)malloc(sizeof(int)*n2);
    if(num2 == NULL)
    {
        printf("malloc fail\n");
        exit(-1);
    }
    for(int i = 0;i<n2;i++)
    {
        scanf("%d",&num2[i]);
    }
    BubbleSort(num1, n1);
    n1 = erase(num1, n1);
    BubbleSort(num2, n2);
    n2 = erase(num2, n2);
    int i = 0,j = 0;
    for(;i<n1&&j<n2;)
    {
        if(num1[i]<num2[j])
        {
            printf("%d",num1[i]);
            i++;
        }
        else if(num1[i] == num2[j])
        {
            i++;
        }
        else
        {
            printf("%d",num2[j]);
            j++;
        }
    }
    if(i==n1)
    {
        for(;j<n2;j++)
        {
            printf("%d",num2[j]);
        }
    }
    else
    {
        for(;i<n1;i++)
        {
            printf("%d",num1[i]);
        }
    }
    free(num1);
    free(num2);
    return 0;
}
发表于 2023-10-13 21:14:58 回复(0)
#include <math.h>
#include <stdio.h>
#include<stdlib.h>
int sortpos(int a[], int low, int high) {
    int pivot = a[low];
    while (low < high) {
        while (low < high && pivot <= a[high]) high--;
        a[low] = a[high];
        while (low < high && a[low] <= pivot)low++;
        a[high] = a[low];
    }
    a[low] = pivot;
    return low;
}
void sort(int a[], int high, int low) {
    if (low < high) {
        int pos = sortpos(a, low, high);
        sort(a, pos - 1, low);
        sort(a, high, pos + 1);
    }
}
int main() {
    int m, n, i, j, k;
    int tem;
    scanf("%d", &m);
    int* a = (int*)malloc(m * sizeof(int));
    for (i = 0; i < m; i++) scanf("%d", &a[i]);

    scanf("%d", &n);
    int* b = (int*)malloc(n * sizeof(int));
    int* c = (int*)malloc((n + m) * sizeof(int));
    for (i = 0; i < n; i++) scanf("%d", &b[i]);

    i = j = 0;
    sort(a, m - 1, 0);
    sort(b, n - 1, 0);
    k = 0;
    while (i < m && j < n) {
        if (a[i] < b[j]) {
            c[k] = a[i];i++;
        }
        else {
            c[k] = b[j];j++;
        }
        k++;
    }
    while (i < m) {
        c[k] = a[i];
        i++;
        k++;
    }
    while (j < n) {
        c[k] = b[j];
        k++;
        j++;
    }
    free(a);
    free(b);
    //剔除重复的数字
    i=1;
    while(i<k){
        if(c[i]==c[i-1]){
            for(j=i;j<k-1;j++){
                c[j]=c[j+1];
               
            }
            k--;
        }
        else i++;
    }
    for (i = 0; i < k; i++) printf("%d", c[i]);
    free(c);
    return 0;
}
发表于 2023-04-09 18:13:32 回复(0)
#include <stdio.h>
#define    N    1000
int main()
{
    int arr[N],m,i=0,j,temp,k=2;
    while(k>0)
    {
        scanf("%d",&m);
        while(m>0)
        {
            scanf("%d",&temp);
            if(i==0)
            arr[i++]=temp;
            else
            {
                for(j=0;j<i;j++)
                {
                    if(temp==arr[j])
                        break;
                }
                if(j==i)
                    arr[i++]=temp;
            }
            m--;
        }
        k--;
    }
    m=i;
    //sort
    for(i=0;i<m-1;i++)
    {
        for(j=0;j<m-1-i;j++)
        {
            if(arr[j]>arr[j+1])
            {
                temp=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=temp;
            }
        }
    }
    for(i=0;i<m;i++)
    {
        printf("%d",arr[i]);
    }
    return 0;
}
我直接用一个数组完成,大力出奇迹。。。
发表于 2022-04-24 11:33:03 回复(0)
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int cmp(const void *a,const void *b)
{
    return *(int *)a-*(int *)b;
}
int In[500];
int main(void){
    int a,b,i,flag=0,temp;
    scanf("%d",&a);
    for(i=0;i<a;i++){
        scanf("%d",&In[i]);
    }
    scanf("%d",&b);
    for(i=a;i<a+b;i++){
        scanf("%d",&In[i]);
    }
    qsort(In,a+b,sizeof(int),cmp);
    for(i=0;i<a+b;i++) {
        if(temp != In[i]) {
            printf("%d",In[i]);
            temp = In[i];
        }
    }
    return 0;
}
发表于 2022-04-03 23:09:23 回复(0)
#include "stdio.h"
#include "string.h"

/*快速排序之确定枢纽节点*/
int partition(int A[], int low, int high)
{
    int pivot = A[low];
    while(low < high)
    {
        while(low < high && A[high] >= pivot) high--;
        A[low] = A[high];
        while(low < high && A[low] < pivot) low++;
        A[high] = A[low];
    }
    A[low] = pivot;
    return low;
}
//快速排序递归函数
void QuickSort(int A[], int low, int high)
{
    if(low<high)
    {
        int pivotpos = partition(A,low,high);//划分
        QuickSort(A, low, pivotpos-1);//划分左表
        QuickSort(A, pivotpos+1, high);//划分右表
        
    }
}


int main()
{
    int N = 0;
    int M = 0;
    
    while(scanf("%d", &N) != EOF)
    {
        int ZeroFlag = 0;
        int a[1000] = {0};
        for(int i=0; i<N; i++)
        {
            scanf("%d", &a[i]);
        }
        scanf("%d", &M);
        for(int i=0; i<M; i++)
        {
            scanf("%d", &a[i+N]);
        }
#if 0
        int temp = 0;
        /*冒泡排序*/
        int flag, ExcPos;
        
        for(int i= 1; i<(N+M); i++)
        {
            flag = 0;
            for(int j=N+M-1; j>=i; j--)
            {
                if(a[j-1] > a[j])
                {
                    temp = a[j-1];
                    a[j-1] = a[j];
                    a[j] = temp;
                    flag = 1;//本次有过交换,置1。
                    ExcPos = j;//记录交换的位置,j前面的数据已经有序
                }
            }
            if(!flag)//数组已经有序
                break;
            i = ExcPos;
            i--;
        }
#elif 0
        /*插入排序*/
        int temp = 0;
        for(int i=1; i<N+M; i++)
        {
            int flag = 0;
            if(a[i-1] > a[i])
            {
                temp = a[i];
                int j;
                for(j=i; j>=1 && a[j-1] > temp; j--)
                {
                    a[j] = a[j-1];
                }
                a[j] = temp;
            }
        }
#elif 1
    /*快速排序*/
        QuickSort(a, 0, N+M-1);
        
        
#endif
        for(int i=0; i<(N+M); i++)
        {
            if(a[i-1] != a[i])
            printf("%d", a[i]);
        }
        printf("\n");
    }
    
    return 0;
}

发表于 2021-09-14 11:54:17 回复(0)