有两数组A、B,长度分别为m、n。用不超过m+n的比较次数找到两个数组中的相同元素

今天碰到一道笔试题:有两数组A、B,长度分别为m、n。用不超过m+n的比较次数找到两个数组中的相同元素。当时没做出来,我现在给出C#版本,算是弥补一点遗憾。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SortAB
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] A = RandomIntArray(10); // m = 10
            int[] B = RandomIntArray(5);  // n = 5

            // 输出两个数组
            Console.Write("数组A:");
            foreach(int m in A)
                Console.Write("{0} ", m.ToString());

            Console.Write("\n数组B:");
            foreach (int n in B)
                Console.Write("{0} ", n.ToString());

            // 找出数组中相同的元素
            StringBuilder list = new StringBuilder();
            foreach (int m in A)
            {
                int getInt = find(m, B);
                if (getInt != -1)
                    list.Append(B[getInt]);
            }
            Console.WriteLine();
            Console.Write("两个数组中重复的元素有:{0} ", list);

            // 用两个数组的交集,来验证
            IEnumerable<int> intersect = A.Intersect(B);
            Console.Write("\n两个数组的交集:");
            foreach (int vars in intersect)
                Console.Write("{0} ", vars);

            Console.ReadLine();
        }
        // 二分查找。N 必须为有序数组,否则会出错
        public static int find(int key, int[] N)
        {
            int lb = 0;
            int ub = N.Length - 1;
            int temp;
            while(true)
            {
                temp = (lb + ub)/2;
                if(N[temp] == key)    return temp;
                else if(lb > ub)      return -1;
                else
                {
                    if(N[temp] < key)    lb = temp+1;
                    else                   ub = temp-1;
                }
            }
        }

        public static int[] RandomIntArray(int count)
        {
            int[] array = new int[count];
            Random r = new Random(unchecked((int)DateTime.Now.Ticks));
            for (int i = 0; i < count; i++)
            {
                array[i] = r.Next(100);
            }
            return array;
        }
    }
}

不过,我现在仍是疑惑:比较次数有可能会大于m+n。

有两数组A、B,长度分别为m、n。用不超过m+n的比较次数找到两个数组中的相同元素,布布扣,bubuko.com

时间: 2025-01-05 18:58:18

有两数组A、B,长度分别为m、n。用不超过m+n的比较次数找到两个数组中的相同元素的相关文章

关于String类和String[]数组的获取长度方法细节

一.在Java中,以下代码段有错误的是第(  )行 public static void main(String[] args) { String name = "小新";                       //第一行 String sex = new String("男");          //第二行 String age = 18+"";                       //第三行 int len = name.le

Android For JNI(四)——C的数组,指针长度,堆内存和栈内存,malloc,学生管理系统

Android For JNI(四)--C的数组,指针长度,堆内存和栈内存,malloc,学生管理系统 好几天每写JNI了,现在任务也越来越重了,工作的强度有点高,还有好几个系列的博客要等着更新,几本书还嗷嗷待哺的等着我去看,github上的两个散漫的开源,基础入门的视频也在录制,还要学习新的知识, 都是一种挑战,不知道为何,最近懒散了,看来还得再加把劲,今天我们继续延伸一下C的一些小知识 一.数组 C的数组和JAVA也是类似的,我们写一段小程序 #include <stdio.h> #inc

数组、字符串长度的计算(转)

转自:https://blog.csdn.net/duan19920101/article/details/50606351 常见的计算长度的函数有两个,sizeof()和strlen(),但是,它们之间的差别还是很大的. sizeof():主要负责计算数组的长度: strlen():主要负责计算字符串的长度. (1)sizeof():数组占用字节除以数组类型所占字节,结果为数组元素个数       使用方法:sizeof(数组名)/ sizeof(数组类型名) (2)strlen():strl

Single Number 数组中除了某个元素出现一次,其他都出现两次,找出这个元素

Given an array of integers, every element appears twice except for one. Find that single one. Note:Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory? 数组中除了某个元素出现一次,其他都出现两次,找出只出现一次的元素. 一个数字和自己异或

RSA加密解密 错误:Base-64 字符数组的无效长度

文章1.程序中实现了这样一个功能,将一个对象序列化后,作为参数传递给另一个页面,这个页面得到参数并反序列化后还原此对象,但是在运行时有时正常,有时出现“base-64 字符数组的无效长度”的错误提示. 在网上查找资料,都是说在使用Convert.ToBase64String()方法对字符串进行Base64编码时,需要使参数的长度等于4或4的偶数倍数,否则将抛出“FormatException”异常.但是我这里使用的参数是使用Convert.ToBase64String()方法生成的,理论上是没有

给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。

描述 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 0 到 n-1. 你可以假设只有一组答案. 样例 Example1: 给出 numbers = [2, 7, 11, 15], target = 9, 返回 [0, 1]. Example2: 给出 numbers = [15, 2, 7, 11], target = 9, 返回 [1, 2]. 1 /** 2 *

NX二次开发-算法篇-判断找到两个数组里不相同的对象

1 NX9+VS2012 2 3 #include <uf.h> 4 #include <uf_curve.h> 5 #include <uf_modl.h> 6 #include <vector> 7 #include <uf_disp.h> 8 9 10 UF_initialize(); 11 12 //第一步,创建5条直线 13 UF_CURVE_line_t Coords1; 14 Coords1.start_point[0] = 0.0

找出两个整型数组中的公共元素的最大值

一,问题描述 给定两个整型数组,找出这两个数组中的最大的公共元素.注意条件:①公共元素   ②最大的公共元素 比如:arr1={8,2,9,6,18,7,25,28}   arr2={6,39,4,9,25,18,36,12}.假设 arr1 的长度为M,arr2的长度为N 这两个数组的最大公共元素是:25 二,思路 ①对 arr1 中的每个元素arr1[i],去 arr2 查找是否也存在 该元素,若存在则标记起来,因为它虽然是公共的,但不一定是最大的. 直到扫描完arr1中的所有元素,这种方式

动态数组,数组初始化,数组内存释放,向数组中添加一个元素,向数组中添加多个元素,数组打印,顺序查找,二分查找,查找数组并返回地址,冒泡排序,改变数组中某个元素的值,删除一个数值,删除所有,查找含有

 1定义接口: Num.h #ifndef_NUM_H_ #define_NUM_H_ #include<stdio.h> #include<stdlib.h> /************************************************************************/ /*数组的结构体类型                                                    */ /*******************