iT邦幫忙

0

計算同時出現在2個陣列的數字

c#

最近看到這個題目,程式碼如下


        public void Run()
        {
            Random seed = new Random();
            int[] itemsA = new int[20000];
            int[] itemsB = new int[20000];
            for (int i = 0; i < 20000; i++)
            {
                itemsA[i] = seed.Next(10000);
                itemsB[i] = seed.Next(10000);
            }

            DateTime now = DateTime.Now;
            Console.WriteLine("同時出現在2個陣列的數字有 {0} 筆, 費時 {1:0.00}秒",
                GetSameValues(itemsA, itemsB).Length, (DateTime.Now - now).TotalSeconds);
        }

        public int[] GetSameValues(int[] itemsA, int[] itemsB)
        {
            //請實作
            throw new NotImplementedException();
        }

我目前想到這一步後面暫時沒想法

 for(int i = 0; i < itemsA.Length; i++)
            {
                for (int j = 0; j < itemsB.Length; j++)
                {
                    if(itemsA[i] == itemsB[j])
                    {

                    }
                } 
            }

不知道這個該如何解?

更新

大概是這樣寫

        public static int[] GetSameValues(int[] itemsA, int[] itemsB)
        {
            var intersect = itemsA.Intersect(itemsB);
            int[] result = new int[0];
            foreach (int id in intersect)
            {
                result = new int[id];
                
                
            }

            return result;
        }

感謝解答

1
一級屠豬士
iT邦大師 1 級 ‧ 2021-04-30 11:37:01
最佳解答
tenno081 iT邦新手 4 級 ‧ 2021-04-30 11:47:51 檢舉

你好,這個寫法最初我也是這樣用,但我遇到回傳的問題
現在是在想要怎麼回傳

0
theQuert
iT邦新手 5 級 ‧ 2021-04-30 11:48:05

可以先把一個array的東西一個個用loop存到hash map,再從hash map中找

tenno081 iT邦新手 4 級 ‧ 2021-04-30 11:53:19 檢舉

你好,目前我是這樣做

  public  int[] GetSameValues(int[] itemsA, int[] itemsB)
        {
            IEnumerable<int> intersect =                               itemsA.Intersect(itemsB);
            return (int[])intersect;        
        }

但目前遇到一個問題
GetSameValues顯示需要有物件參考 才可使用非靜態欄位、方法或屬性
請問這個是?

0
koro_michael
iT邦新手 3 級 ‧ 2021-04-30 12:05:47
using System;
using System.Collections.Generic;
using System.Linq;	
public class Program
{
	public static void Main()
	{
		(new Program()).Run();
	}
	
	public void Run()
	{
		Random seed = new Random();
		int[] itemsA = new int[20000];
		int[] itemsB = new int[20000];
		for (int i = 0; i < 20000; i++)
		{
			itemsA[i] = seed.Next(10000);
			itemsB[i] = seed.Next(10000);
		}

		DateTime now = DateTime.Now;
		Console.WriteLine("同時出現在2個陣列的數字有 {0} 筆, 費時 {1:0.00}秒",
						  GetSameValues(itemsA, itemsB).Length, (DateTime.Now - now).TotalSeconds);
	}

	public int[] GetSameValues(int[] itemsA, int[] itemsB)
	{
		IEnumerable<int> intersect = itemsA.Intersect(itemsB);
        return intersect.ToArray();     
	}
}
看更多先前的回應...收起先前的回應...
tenno081 iT邦新手 4 級 ‧ 2021-04-30 12:07:10 檢舉

感謝,原來只要這樣就好,我寫的反而多餘,謝謝

tenno081 如果你想要自己實作的話

public int[] GetSameValues(int[] itemsA, int[] itemsB)
{
    List<int> result = new List<int>();
    HashSet<int> temp = new HashSet<int>();
    foreach (int i in itemsB) {
        temp.Add(i);
    }
    foreach (int i in itemsA) {
        if (temp.Remove(i)) {
            result.Add(i);
        }
    }

    return result.ToArray();
}

大概是這樣子,鮮少寫 C# ,就參考著用吧

有幫助到你麻煩給個最佳解答

tenno081 iT邦新手 4 級 ‧ 2021-04-30 12:24:50 檢舉

感謝,可是我太早給了,真的很抱歉QQ

沒事

我要發表回答

立即登入回答