Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一种查找两个数组之间公共整数的方法_C#_Arrays - Fatal编程技术网

C# 一种查找两个数组之间公共整数的方法

C# 一种查找两个数组之间公共整数的方法,c#,arrays,C#,Arrays,我需要编写一个方法来查找C中两个数组之间的公共点,但问题是我无法将我的python逻辑从过去转换为C 在python中曾经是这样的: def commonfinder(list1, list2): commonlist = [] for x in list1: for y in list2: if x==y: commonlist.append(x) return commonlist 但当我尝试将其转换为C时:

我需要编写一个方法来查找C中两个数组之间的公共点,但问题是我无法将我的python逻辑从过去转换为C 在python中曾经是这样的:

def commonfinder(list1, list2):
commonlist = []
for x in list1:
    for y in list2:
        if x==y:
            commonlist.append(x)
            
return commonlist
但当我尝试将其转换为C时:

        public int [] Commons(int[] ar1, int[] ar2)
        {
            int commoncount;
            int[] Commonslist = new int[commoncount];
            
            foreach (int x in ar1)
            { 
                foreach (int y in ar2)
                {
                    if (x == y)
                    {
                        commoncount++;
                        // here I should add x to Commonlist
                    }
                }
            }

            return Commonslist;
        }
        
我找不到任何将x附加到我的Commonlist的方法或函数 还有ofc我有很多错误我都解决不了
我能得到一个提示吗?

您的原始算法的时间复杂度为*m,可能太长了: 想象一下,您有100万个项目的列表,每个项目需要执行1万亿次比较。您可以仅使用On+m复杂性实现更好的代码:

代码:让我们概括一下这个问题

using System.Linq;

...

public static T[] CommonFinder<T>(IEnumerable<T> left, 
                                  IEnumerable<T> right,
                                  IEqualityComparer<T> comparer = null) {
  if (null == left || null == right)
    return new T[0]; // Or throw ArgumentNullException exception

  comparer = comparer ?? EqualityComparer<T>.Default;

  Dictionary<T, int> dict = right
    .GroupBy(item => item)
    .ToDictionary(group => group.Key, group => group.Count());

  List<T> result = new List<T>();

  foreach (T item in left)
    if (dict.TryGetValue(item, out int count)) {
      result.Add(item);

      if (count <= 1)
        dict.Remove(item);
      else
        dict[item] = count - 1;
    }

  return result.ToArray();
}
结果:


注意:我的理解是,您需要一个方法,该方法接受2个int数组并生成1个int数组作为具有唯一相交值的输出

您可以使用HashSet来加速插入和查找时间摊销O1。运行时间是OMaxn,m,因为我们必须分别检查整个阵列。就内存而言,omin,m是因为我们在开始时选择较小的数组来填充集合,而对于逻辑的其余部分,自然不会有比较小数组更多的元素,因为它是交集

Main方法向您展示了如何使用该方法。CommonInteger具有您所寻求的逻辑

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

namespace TestCode.StackOverflow
{
    public class So66935672
    {

        public static void Main(string[] args)
        {
            int[] intArray1 = new int[] { 9, 9, 1, 3, 5, 6, 10, 9 };
            int[] intArray2 = new int[] { 19, 17, 16, 5, 1, 6 };

            Console.Write(
                CommonIntegers(intArray1, intArray2)
                    .Select(i => $"{i}, ")
                    .Aggregate(string.Empty, string.Concat));

        }

        private static int[] CommonIntegers(int[] intArray1, int[] intArray2)
        {
            if (intArray1 == null || intArray1.Length == 0
                || intArray2 == null || intArray2.Length == 0)
            {
                return Array.Empty<int>();
            }

            var primaryArraySet = new HashSet<int>(); // Contains the unique values from the shorter array
            var intersectSet = new HashSet<int>(); // Contains unique values found in both arrays

            int[] secondarySet;

            // Fill primary set
            if (intArray1.Length > intArray2.Length)
            {
                foreach (var i in intArray2)
                    primaryArraySet.Add(i);

                secondarySet = intArray1;
            }
            else
            {
                foreach (var i in intArray1)
                    primaryArraySet.Add(i);

                secondarySet = intArray2;
            }

            // Fill intersect array
            foreach (var i in secondarySet)
                if (primaryArraySet.Contains(i))
                    intersectSet.Add(i);

            return intersectSet.ToArray();
        }
    }
}
你可以试试这个:

static List<int> CommonFinder(List<int> list1, List<int> list2)
{
    List<int> commonList = new List<int>();
    foreach (int x in list1)
        foreach (int y in list2)
            if (x == y)
                commonList.Add(x);
    return commonList;
}

static void Main()
{
    List<int> list1 = new List<int> { 1, 2, 3 };
    List<int> list2 = new List<int> { 2, 3, 4};

    var common = CommonFinder(list1, list2);

    Console.WriteLine(string.Join(", ", common));
}

您可以使用,并且Commoncount方法将初始化为零。因此,在开始时将有一个非常短的数组。如果您试图将代码转换为c,则应使用c提供的适当工具。使用可扩展的集合,如ListHow about,只返回ar1.Intersectar2.ToArray?真不敢相信我竟然忘了Intersect。我很想知道它的计算和内存复杂性。你对输入有什么假设。1.每个数组中是否存在任何可能的重复值?2.您希望如何处理输出中的重复项?
using System;
using System.Collections.Generic;
using System.Linq;

namespace TestCode.StackOverflow
{
    public class So66935672
    {

        public static void Main(string[] args)
        {
            int[] intArray1 = new int[] { 9, 9, 1, 3, 5, 6, 10, 9 };
            int[] intArray2 = new int[] { 19, 17, 16, 5, 1, 6 };

            Console.Write(
                CommonIntegers(intArray1, intArray2)
                    .Select(i => $"{i}, ")
                    .Aggregate(string.Empty, string.Concat));

        }

        private static int[] CommonIntegers(int[] intArray1, int[] intArray2)
        {
            if (intArray1 == null || intArray1.Length == 0
                || intArray2 == null || intArray2.Length == 0)
            {
                return Array.Empty<int>();
            }

            var primaryArraySet = new HashSet<int>(); // Contains the unique values from the shorter array
            var intersectSet = new HashSet<int>(); // Contains unique values found in both arrays

            int[] secondarySet;

            // Fill primary set
            if (intArray1.Length > intArray2.Length)
            {
                foreach (var i in intArray2)
                    primaryArraySet.Add(i);

                secondarySet = intArray1;
            }
            else
            {
                foreach (var i in intArray1)
                    primaryArraySet.Add(i);

                secondarySet = intArray2;
            }

            // Fill intersect array
            foreach (var i in secondarySet)
                if (primaryArraySet.Contains(i))
                    intersectSet.Add(i);

            return intersectSet.ToArray();
        }
    }
}
static List<int> CommonFinder(List<int> list1, List<int> list2)
{
    List<int> commonList = new List<int>();
    foreach (int x in list1)
        foreach (int y in list2)
            if (x == y)
                commonList.Add(x);
    return commonList;
}

static void Main()
{
    List<int> list1 = new List<int> { 1, 2, 3 };
    List<int> list2 = new List<int> { 2, 3, 4};

    var common = CommonFinder(list1, list2);

    Console.WriteLine(string.Join(", ", common));
}