8

整数配列から重複を削除するコードをいくつか書きました。組み込みのキーワード/プロパティを使用したくありません。

ここに私の論理があります:

int[] iArray = {1,2,3,2,3,4,3};              
int t = 0;
int arraysize = iArray.Length;
for (int m = 0; m < arraysize; m++)
{
    if (iArray[m] != iArray[t])
    {
        t++;
        iArray[t] = iArray[m];
    }
}
arraysize = t + 1;
for (int m = 0; m < arraysize; m++)
{
    Console.WriteLine(iArray[m]);
}

出力は次のようになります。

1,2,3,4

目的の出力が得られません。皆さん、これは宿題ではありません。これが自己学習です。LINQ なし、キーワードを含めてください。返信ありがとうございます。

ありがとう。

4

14 に答える 14

6

これは宿題なので、コードを修正しませんが、代わりにいくつかのメモを示します。

  1. 単一のループと組み込み関数なしでは実行できません。ネストされたループが 2 つ必要です
  2. 重複する値が見つかったら、配列項目を 1 つ前に移動し、配列の「アクティブ領域」のサイズを減らします。移動するには、別のネストされたループが必要です。
于 2012-08-22T12:51:16.627 に答える
3

ネストされた2つのforeachループを使用してこれを行う方法は次のとおりです。

var array = new int[] {1,2,3,2,3,4,3};  

var result = new List<int>();
foreach(var item in array)
{
    bool found = false;
    foreach(var resultItem in result)
    {
        if(resultItem == item) found = true;
    }

    if(!found)
    {
        result.Add(item);
    }
}

を使用したくない場合List<int>は、最初の配列のサイズで一時配列を作成する必要があります。次に、それが処理されたら、実際に見つけたアイテムの数を追跡し、それらを新しい配列にコピーする必要があります。

于 2012-08-22T12:56:34.100 に答える
2

問題は、各要素を前の要素とのみ比較していることです。これは自習用の演習であるため、その方法の概要のみを説明し、詳細はあなたに任せます。

2 つのネストされたループが必要です。

  • 最初のループは、各要素を反復処理します。
  • 2 番目のループは、現在の要素をこれまでに見た他のすべての要素と比較します。

これには O(n 2 ) 時間がかかることに注意してください。


他のアプローチを使用すると、より高速に実行できます。

  • 最初に入力をソート: O(n log(n)) 時間
  • HashSetorの使用Enumerable.Distinct: O(n) 時間。

ただし、これらの後者のアプローチは、組み込みのクラス/メソッドを使用しないという要件により、おそらく両方とも許可されていません。

于 2012-08-22T12:51:08.573 に答える
0

必要なことを実行するアルゴリズムの非常に基本的な形式:

        int[] iArray = {1,2,3,2,3,4,3};
        int[] newArray = new int[iArray.Length];          

        //initialize array with a marker
        for(int i = 0; i < newArray.length; i++){
          newArray = -1 //this shouldn't be a potential value in the original arr
        }

        bool contains = false;
        int curLength = 0;
        for (int m = 0; m < iArrayLength; m++)
        {
           contains = false;
           for(int k = 0; k < curLength; k++){
                 if(newArray[k] == iArray[m]){
                    contains = true;
                    break;
                 }
           }
           if(!contains) 
                 newArray[curLength++] = iArray[m];
        }
        for (int m = 0; m < curLength; m++)
        {
            Console.WriteLine(newArray[m]);
        }
于 2012-08-22T12:54:48.297 に答える
0

arrayListよりも高速なDictionaryを使用することもできます

    public Dictionary<string,int> removeDupUsingDictionary(int[] n)
    {

        Dictionary<string,int> numbers = new Dictionary<string,int>();

        for( int i = 0 ; i< n.Length; i ++)
        {
            try
            {
                numbers.Add("value" + n[i], n[i]);
            }
            catch (Exception e)
            {
                Console.WriteLine("Already the value" + n[i] + "present in the dictionary");
            }


        }

        return numbers;

    }



    static void Main(string[] args)
    {

        Program num = new Program();
        int[] n = { 6,5,1, 2, 3, 4, 5, 5, 6,6,6,6,6,6 };

        Dictionary<string, int> dictionary = new Dictionary<string, int>();

        int size = n.Length;


        ArrayList actual = num.removeDup(n);

        num.removeDupUsingDictionary(n);



    }
于 2012-09-12T06:03:06.893 に答える
0

さて、あなたは何も組み込みたくないと言ったので、すべてを最初からやりましょう。

これを行うには(私が知っている)2つの方法があります。1つは複雑さO(n ^ 2)で、もう1つは複雑さO(n + n * log(n))です。2つ目は高速ですが、1つ目は簡単です。

より遅い(しかしより簡単な)解決策:O(n ^ 2)

int[] iArray = {1,2,3,2,3,4,3};
List<int> unique = new List<int>(iArray.Length);

for(int i = 0; i<iArray.length; i++)
{
    bool found = false;
    for(int prev=0; prev<i; prev++)
    {
        if(iArray[prev] == iArray[i])
        {
            found = true;
            break;
        }
    }

    if(!found)
    {
        unique.Add(iArray[i]);
    }
}

iArray = unique.ToArray();

for(int i=0; i<iArray.Length; i++)
{
    Console.WriteLine(iArray[i]);
}

より高速な(しかしより複雑な)ソリューション:O(n + n * log(n))

int[] iArray = {1,2,3,2,3,4,3};
List<int> unique = new List<int>(iArray.Length);

// Sort the array here. Use your favorite algorithm. Sorting is so widely
// covered elsewhere that I will avoid typing it here. Complexity should 
// be O(n*log(n))

if( iArray.Length > 0)
{
    unique.Add(iArray[0]);
}

for(int i=1; i<iArray.length; i++)
{
    if(iArray[i] != iArray[i-1])
    {
        unique.Add(iArray[i]);
    }
}

iArray = unique.ToArray();

for(int i=0; i<iArray.Length; i++)
{
    Console.WriteLine(iArray[i]);
}
于 2012-08-22T12:56:47.793 に答える
0

辞書に入力し、結果配列としてキーを使用するだけです。

Dictionary<int, int> dict = new Dictionary<int, int>();
for(int i = 0; i < array.Length; i++) {
  dict[array[i]] = 0;
}

dict.Keys-結果。

于 2012-08-22T12:58:08.240 に答える
0

最初にアイテムを注文し、次のものと比較した後、nlogn のコストがかかります。

アルゴリズム:

  1. 順序配列

  2. foreach elem if(has_next && next is equal) 要素を削除します。次

  3. 配列を印刷する

スペースのコストが問題にならない場合は、補助ハッシュテーブル構造体を使用できます。しかし、私は自分の考えはもっと単純だと考え続けています。

于 2012-08-22T13:50:49.867 に答える
0

あなたの答えは:

    int[] oldArray = {1, 2, 3, 2, 3, 4, 3 };
    int[] newArray = oldArray.Distinct().ToArray();

    String ans = "";
    for (int m = 0; m < newArray.Length; m++)
    {
        ans += newArray[m] +",";
    }
    Console.WriteLine(ans);
于 2013-07-31T07:18:36.340 に答える
0

これが解決策です:

int[] iArray = { 1, 2, 3, 2, 3, 4, 3 };
int[] EachWords = { 1, 2, 3, 2, 3, 4, 3 };

for (int p = 0; p < EachWords.Length; p++)
{
    for (int j = 0; j < EachWords.Length; j++)
    {
        if (EachWords[p] == EachWords[j] && p != j)
        {
            List<int> tmp = new List<int>(EachWords);
            tmp.RemoveAt(j);
            EachWords = tmp.ToArray();
        }
    }
}

for (int j = 0; j < EachWords.Length; j++)
{
    Response.Write(EachWords[j].ToString() + "\n");
}

今、それは表示されます1, 2, 3, 4

于 2012-08-22T13:03:26.513 に答える
0
static void Main(string[] args)
        {
            int[] array = new int[] { 4, 8, 4, 1, 1, 4, 8 };            
            int numDups = 0, prevIndex = 0;

            for (int i = 0; i < array.Length; i++)
            {
                bool foundDup = false;
                for (int j = 0; j < i; j++)
                {
                    if (array[i] == array[j])
                    {
                        foundDup = true;
                        numDups++; // Increment means Count for Duplicate found in array.
                        break;
                    }                    
                }

                if (foundDup == false)
                {
                    array[prevIndex] = array[i];
                    prevIndex++;
                }
            }

            // Just Duplicate records replce by zero.
            for (int k = 1; k <= numDups; k++)
            {               
                array[array.Length - k] = '\0';             
            }


            Console.WriteLine("Console program for Remove duplicates from array.");
            Console.Read();
        }
于 2013-07-03T07:57:32.960 に答える
0
int[] iArray = { 1, 2, 3, 2, 3, 4, 3 };

        List<int> unique = new List<int>(iArray.Length);                      

        for (int i = 0; i < iArray.Length; i++)
        {
            int count=0;
            for (int j = i + 1; j < iArray.Length; j++)
            {
                if (iArray[i] == iArray[j])
                {
                    count++;
                }
            }
            if (count==0)
            {
                unique.Add(iArray[i]);
            }
        }

        iArray = unique.ToArray();

        for (int i = 0; i < iArray.Length; i++)
        {
            Console.WriteLine(iArray[i]);
        }
于 2013-07-31T06:18:01.637 に答える
-1

このソリューションは JavaScript です。

var myval = [1, 2,3, 4, 4, 5, 5, 6, 7];

var tempVal = [];
var l = myval.length;
for(var i=0; i<l; i++){
    if(tempVal.length === 0){
        tempVal.push(myval[i]);
    }
    else{
        var tempL = tempVal.length;
        var foundCount = 0;
        var lookedFor = myval[i];
        for(var t = 0; t<tempL; t++){
            if(tempVal[t] === lookedFor){
                foundCount++;
            }

        }
        if(foundCount === 0){
            tempVal.push(lookedFor);
        }
    }
}       
于 2013-02-10T14:20:11.977 に答える