关于求出两个整形数组不同元素,要求效率最高

由于两个数组,一比较就会出现两次for循环,所以我能想到的就是组合求出现次数,这样子,就不会出现两次for循环,上代码,希望有看到的提出更好的方法

 1 #include <iostream>
 2 using namespace std;
 3
 4 void printarray(int *arr, int size)
 5 {
 6     if (arr == nullptr)
 7     {
 8         return;
 9     }
10     cout << endl;
11     for (int i = 0; i < size; i++)
12     {
13         cout << arr[i] << " ";
14     }
15     cout << endl;
16 }
17
18 int main()
19 {
20     int a[] = {1, 2, 3, 4, 5};
21     int b[] = {1, 4, 5, 6, 9, 8};
22     int i = 0, j = 0;
23
24     int counta = sizeof(a)/sizeof(int); //a数组长度
25     int countb = sizeof(b) / sizeof(int); //b数组长度
26
27     cout << "a数组元素:";
28     printarray(a, counta);
29
30     cout << "b数组元素:";
31     printarray(b, countb);
32
33     int *c = new int[counta + countb]; //用于存储a、b组合后的数组
34
35     //将a数组存入c数组中
36     for (i = 0; i < counta; i++)
37     {
38         c[i] = a[i];
39     }
40     //将b数组存入c数组中,紧接着a数组里的元素
41     for (i = counta, j = 0; i < counta + countb/*j < countb*/; i++,j++)
42     {
43         c[i] = b[j];
44     }
45
46     //求出两个数组中最大的那个值
47     int maxnum = c[0];
48     for (i = 0; i < counta + countb; i++)
49     {
50         if (maxnum < c[i])
51         {
52             maxnum = c[i];
53         }
54     }
55
56     //将数组里的元素值作为d数组的下标,这样,出现这个数字一次,
57     // d数组相应下标的元素值就加一,最后判断d数组里面元素的值,
58     // 就知道a、b数组里面每个数字出现的次数
59     // 所以一定需要求出最大的哪个元素,用来确定d数组的长度
60
61     int *d = new int[maxnum + 1];
62     memset(d, 0, sizeof(int)*(maxnum + 1)); //将d数组全部初始化为0
63
64     cout << "组合后的数组是:";
65     printarray(c, counta + countb);
66
67     cout << "相同的数字:";
68     for (i = 0, j = 0; i < counta + countb; i++)
69     {
70         if (d[c[i]] >= 1)//如果d[c[i]]的值大于等于1,那么说明这个下标的值在组合数组c里面已经出现过1次以上
71         {
72             d[c[i]]++;
73             cout << c[i] <<" ";
74         }
75         else
76         {
77             d[c[i]]++;
78         }
79     }
80
81     cout << "\na数组和b数组不相同的数字是:";
82     for (i = 0; i <= maxnum; i++)
83     {
84         if (d[i] == 1)
85         {
86             cout << i << " ";
87         }
88     }
89     cout << endl;
90
91     return 0;
92 }

运行结果:

关于求出两个整形数组不同元素,要求效率最高

时间: 2024-10-07 05:02:29

关于求出两个整形数组不同元素,要求效率最高的相关文章

Java实现升序排列的整形数组A,元素两两不相等找出A[i]=i的数据

import java.util.ArrayList; //升序排列的整形数组A,元素两两不相等.请设计高效的算法找出A[i]=i的数据. //使用二种方法 public class BinarySearch { public static void main(String[] args) {     int[] nums={-1,1,2,3};     ArrayList<Integer> res=find(nums);     for(int e:res){      System.out

c编程:求出4&amp;#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max,min; int max1,max2;//记录最大值的坐标 int min1,min2;//记录最小值的坐标 int i,j; int a[4][4]; //为数组赋值 for(i=0;i<4;i++) { for(j=0;j<4;j++) { scanf("%d",&

c编程:求出4&#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max,min; int max1,max2;//记录最大值的坐标 int min1,min2;//记录最小值的坐标 int i,j; int a[4][4]; //为数组赋值 for(i=0;i<4;i++) { for(j=0;j<4;j++) { scanf("%d",&

Java算法——求出两个字符串的最长公共字符串

问题:有两个字符串str1和str2,求出两个字符串中最长公共字符串. 例如:“acbbsdef”和"abbsced"的最长公共字符串是“bbs” 算法思路: 1.把两个字符串分别以行和列组成一个二维矩阵. 2.比较二维矩阵中行和列对应的每个点的字符是否相同,是设置这个点为1,否设置这个点为0. 3.通过查找值为1的最长对角线来找到最长公共字符串. 通过上面str1和str2两个字符串,分别得出以行和列组成的一个二维矩阵如下图: 从上图可以看到,str1和str2共有3个公共子串&qu

【C语言】不使用大小于号,求出两数最大值

//不使用大小于号,求出两数最大值 #include <stdio.h> #include <math.h> double Max(double a, double b) { double q = sqrt((a-b)*(a-b)); return ((a + b) + q) / 2; } int main() { printf("(5,8)大的数为:%.0f\n", Max(5, 8)); printf("(0,4)大的数为:%.0f\n"

程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】

转!http://blog.csdn.net/dabusideqiang/article/details/38271661 11.求旋转数组的最小数字 题目:输入一个排好序的数组的一个旋转,输出旋转数组的最小元素. 分析:数组的旋转:把一个数组最开始的若干个元素搬到数组的末尾.例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1.这道题最直观的解法并不难.从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N).但这个思路没有利用输入数组

整形数组的元素分类

一个整型数组,姑且将所有元素都设置为正整数,例如{1,2,3,4,5,6,7,8,9,10}现在要求将数组中的奇数放置到数组前面部分,偶数放置到数组的后面部分,应该怎么做呢?这个小编程题并不算难,很容易能够想到思路,我的第一种思路是这样:将数组拷贝一份,遍历拷贝的数组,奇数放到原数组前面部分,从下标0开始,偶数放到原数组后面部分,从最大下标开始,代码如下: void sort(int *arr, int sz) //指向数组的指针和数组大小 { int *arr2=(int *)malloc(s

关于两数组,求出两数组中相同的的对象

1:平常的操作 (直接同for循环) let a = [{ id: '1', name: '1' }, { id: '2', name: '2' }, { id: '3', name: '2' }] let b = [{ id: '3', name: '3' }, { id: '1', name: '1' } ] let c = [] //定义一个接受相同数组的数组 let num = 0 for (let item of a) { num++ for (let items of b) { nu

输入一个整形数组,元素有正有负,一个或者多个连续的元素为其子数组,求所有子数组中和的最大值

public class Zhejiang { public static void main(String[] args) { int[] arr=new int[] {1,-2,3,10,-4,7,2,-5}; int i=getGreatestSum(arr); System.out.println(i); } private static int getGreatestSum(int[] arr) { if (arr==null||arr.length==0) { return 0; }