C#两数组的交集

本文介绍了一种计算两个整数数组交集的算法实现,重点在于如何确保结果中每个元素都是唯一的,并且不需要对最终结果进行排序。通过遍历和交换元素的方式避免重复计算,提高了算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

Given two arrays, write a function to compute their intersection.

给出两个数组,找出他们的交集

Example:
Given nums1 = [1, 2, 2, 1]nums2 = [2, 2], return [2].

Note:

  • Each element in the result must be unique.
  • 每个数组的结果必须唯一
  • The result can be in any order.
  • 结果顺序不要求排序

思路:

1、遍历第一个数组,分别与第二个数组的每个数比较,判断是否有相同,有则将该数交换到第二个数组的第一个位置。

2、改变第二个数组的索引位置,从下一个位置开始。
    2.1内部循环结束,增加判断,第二数组是否已有该数,有则索引位置回调一位,结束本次循环,否则继续。
3、记录索引位置,输出交集长度

  public int[] Intersection(int[] nums1, int[] nums2) {

  
        int len1 = nums1.Length, len2 = nums2.Length, count = 0;
        int min =len1<len2 ? len1 : len2;
        
       
        if(len1 == 0|| len2 == 0)
        {
            return new int[]{};
        }
            
        for(int i = 0; i < len1 ; i++)
        {
            for(int j = count; j < len2 ; j++)//第二个数组循环查找
            {               
                if(nums1[i] == nums2[j])
                {
                    int temp = nums2[j];
                    nums2[j] = nums2[count];
                    nums2[count ] =temp; 
                  
                    count++;
                    j = len2;
                    
                }                 
            }
            
            for(int k =  count -1; k >= 0 ; k--) //删除数组中重复项
            {
                if(nums2[k] == nums2[count-1]&& k!=(count-1) )   //关键是不比较下标相同的数
                {
                    count--; 
                    k=0;                 
                }                
            }          
        }
        
        int [] insert = new int[count] ;
        for(int i = 0; i<count ;i++)
        {
            insert[i] = nums2[i];    
        }
              
        return  insert;
    }
<think>我们正在寻找与C#数组查询操作相关的练习题。查询操作通常指的是在数组中查找满足特定条件的元素,例如:查找最大值、最小值、满足条件的元素、元素计数等。 根据引用内容,我们可以设计一些练习题,重点放在数组的查询操作上。 练习题1:查找数组中的最大值和最小值 要求:编写一个C#程序,定义一个整数数组,使用循环遍历数组,找出数组中的最大值和最小值,并输出。 练习题2:统计数组中满足条件的元素个数 要求:定义一个整数数组,统计数组中大于10且小于50的元素个数。 练习题3:查找数组中的第一个偶数 要求:编写一个C#程序,定义一个整数数组,使用循环查找第一个出现的偶数,并输出该元素及其索引。如果不存在偶数,则输出提示信息。 练习题4:查找数组中的质数 要求:定义一个整数数组,找出数组中的所有质数,并将它们存入一个新数组中输出。注意:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的数。 练习题5:数组元素求和与平均值 要求:定义一个整数数组,计算数组中所有元素的和以及平均值(保留两位小数)。 练习题6:查找数组中的重复元素 要求:定义一个整数数组,查找数组中重复出现的元素(每个重复元素只输出一次),并输出这些重复元素。 练习题7:数组元素反转 要求:不使用Array.Reverse方法,通过循环将数组元素反转(例如:[1,2,3]变成[3,2,1])。 练习题8:合并两个有序数组 要求:给定两个升序排列的整数数组,合并它们并保持升序排列。注意:不能使用内置排序函数。 练习题9:查找数组中的众数 要求:定义一个整数数组,找出数组中出现次数最多的元素(众数)。如果有多个众数,输出任意一个即可。 练习题10:二维数组查询 要求:定义一个二维整数数组(矩阵),查询该矩阵中所有元素的最大值,并输出其位置(行和列)。 下面我们给出其中两个练习题的示例代码: 练习题1示例代码(查找数组中的最大值和最小值): ```csharp using System; class Program { static void Main() { int[] numbers = { 3, 9, 5, 7, 1, 8, 4, 6, 2 }; int max = numbers[0]; int min = numbers[0]; for (int i = 1; i < numbers.Length; i++) { if (numbers[i] > max) max = numbers[i]; if (numbers[i] < min) min = numbers[i]; } Console.WriteLine($"最大值: {max}"); Console.WriteLine($"最小值: {min}"); } } ``` 练习题3示例代码(查找数组中的第一个偶数): ```csharp using System; class Program { static void Main() { int[] numbers = { 1, 3, 5, 7, 8, 9, 10 }; int firstEven = -1; int index = -1; for (int i = 0; i < numbers.Length; i++) { if (numbers[i] % 2 == 0) { firstEven = numbers[i]; index = i; break; // 找到第一个偶数就退出循环 } } if (index != -1) Console.WriteLine($"第一个偶数是 {firstEven},索引为 {index}"); else Console.WriteLine("数组中没有偶数"); } } ``` 练习题8示例代码(合并两个有序数组): 注意:两个数组都是升序排列,合并后仍然升序。 ```csharp using System; class Program { static void Main() { int[] array1 = { 1, 3, 5, 7 }; int[] array2 = { 2, 4, 6, 8 }; int[] mergedArray = new int[array1.Length + array2.Length]; int i = 0, j = 0, k = 0; // 合并过程 while (i < array1.Length && j < array2.Length) { if (array1[i] <= array2[j]) { mergedArray[k++] = array1[i++]; } else { mergedArray[k++] = array2[j++]; } } // 如果array1还有剩余元素 while (i < array1.Length) { mergedArray[k++] = array1[i++]; } // 如果array2还有剩余元素 while (j < array2.Length) { mergedArray[k++] = array2[j++]; } // 输出合并后的数组 Console.WriteLine("合并后的数组:"); for (int index = 0; index < mergedArray.Length; index++) { Console.Write(mergedArray[index] + " "); } } } ``` 这些练习题覆盖了数组查询的基本操作,包括查找、统计、条件筛选、合并等。通过这些练习,可以加深对C#数组操作的理解。 §§相关问题§§ 1. 在C#中,除了循环,还有哪些方法可以查询数组(如LINQ)? 2. 如何优化数组查询操作的性能? 3. 在大型数组中,二分查找适用于什么情况?如何实现?</think>以下是针对 C# 数组查询操作的精选练习题与示例,涵盖基础查询、条件筛选、统计计算等常见场景: --- ### 练习题 1:查找数组中的最大值和最小值 **要求**:查询整数数组中的最大值和最小值 ```csharp int[] numbers = { 5, 3, 8, 6, 7, 2 }; int max = numbers[0]; int min = numbers[0]; for (int i = 1; i < numbers.Length; i++) { if (numbers[i] > max) max = numbers[i]; if (numbers[i] < min) min = numbers[i]; } Console.WriteLine($"最大值: {max}, 最小值: {min}"); // 输出: 最大值: 8, 最小值: 2 ``` --- ### 练习题 2:筛选满足条件的元素 **要求**:查询数组中所有大于 5 的偶数 ```csharp int[] data = { 2, 7, 4, 9, 6, 12, 3 }; List<int> result = new List<int>(); foreach (int num in data) { if (num > 5 && num % 2 == 0) { result.Add(num); } } Console.WriteLine(string.Join(", ", result)); // 输出: 6, 12 ``` --- ### 练习题 3:统计元素出现频率 **要求**:查询数组中每个元素的出现次数 ```csharp int[] values = { 1, 2, 3, 2, 4, 1, 2 }; Dictionary<int, int> frequency = new Dictionary<int, int>(); foreach (int val in values) { if (frequency.ContainsKey(val)) { frequency[val]++; } else { frequency.Add(val, 1); } } // 输出统计结果 foreach (var pair in frequency) { Console.WriteLine($"{pair.Key}: {pair.Value}次"); } /* 输出: 1: 2次 2: 3次 3: 1次 4: 1次 */ ``` --- ### 练习题 4:二维数组条件查询 **要求**:查询矩阵中所有大于平均值的元素 ```csharp int[,] matrix = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } }; List<int> aboveAvg = new List<int>(); int total = 0, count = 0; // 计算总和 for (int i = 0; i < matrix.GetLength(0); i++) { for (int j = 0; j < matrix.GetLength(1); j++) { total += matrix[i, j]; count++; } } double average = (double)total / count; // 筛选大于平均值的元素 for (int i = 0; i < matrix.GetLength(0); i++) { for (int j = 0; j < matrix.GetLength(1); j++) { if (matrix[i, j] > average) { aboveAvg.Add(matrix[i, j]); } } } Console.WriteLine($"大于平均值{average}的元素: " + string.Join(", ", aboveAvg)); // 输出: 大于平均值5的元素: 6, 7, 8, 9 ``` --- ### 练习题 5:使用 LINQ 实现高级查询 **要求**:查询数组中长度大于 3 的字符串并按字母排序 ```csharp string[] words = { "apple", "cat", "dog", "elephant", "bee" }; var query = from word in words where word.Length > 3 orderby word select word; Console.WriteLine(string.Join(", ", query)); // 输出: apple, bee, elephant ``` --- ### 练习题 6:查找缺失数字 **要求**:在 1-100 的数组中查找缺失的数字 ```csharp int[] fullSet = Enumerable.Range(1, 100).ToArray(); int[] testSet = fullSet.Where(n => n != 42).ToArray(); // 故意移除42 var missing = Enumerable.Range(1, 100).Except(testSet); Console.WriteLine("缺失的数字: " + string.Join(", ", missing)); // 输出: 缺失的数字: 42 ``` --- ### 推荐练习方向 1. **多条件合查询**:如查找年龄在 20-30 岁且工资高于 5000 的员工 2. **分统计**:按部门分计算平均工资 3. **数组交集/并集**:使用 `Intersect()` 和 `Union()` 方法 4. **动态条件查询**:允许用户输入查询条件进行过滤 5. **分页查询**:实现 `Skip()` 和 `Take()` 的分页效果 > 提示:对于复杂查询,可结合 LINQ 的链式调用: > ```csharp > var results = array.Where(x => x > 10) > .OrderBy(x => x) > .Select(x => x * 2); > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值