C# 删除int数组中重复项的程序

C# 删除int数组中重复项的程序,c#,C#,我已经编写了一些代码来删除整数数组中的重复项。 我不想使用任何内置关键字/属性 我的逻辑是: 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] = iAr

我已经编写了一些代码来删除整数数组中的重复项。 我不想使用任何内置关键字/属性

我的逻辑是:

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]);
}
int[]iArray={1,2,3,2,3,4,3};
int t=0;
int arraysize=iArray.Length;
for(int m=0;m
输出应为:

1,2,3,4

它不能提供所需的输出。 伙计们,这不是家常菜。 这是自我学习。 没有LINQ,请包含关键字。 谢谢你的回复


谢谢。

问题在于,您只是将每个元素与前一个元素进行比较。因为这是一个自学练习,我只想给你一个如何做的大纲,让你了解细节

您需要两个嵌套循环:

  • 第一个循环迭代每个元素
  • 第二个循环将当前元素与迄今为止看到的所有其他元素进行比较
注意,这需要O(n2)时间


您可以使用其他方法更快地完成此任务:

  • 首先对输入进行排序:O(n log(n))时间
  • 使用
    哈希集
    可枚举。不同的
    :O(n)时间

但由于您不使用内置类/方法的要求,后两种方法可能都不允许使用。

由于这是一个家庭作业,我不会修改您的代码,而是给您一些提示:

  • 您将无法使用单个循环和没有内置函数来实现这一点;您需要两个嵌套循环
  • 当发现重复值时,将数组项向前移动1,并减小数组“活动区域”的大小;您需要另一个嵌套循环来执行移动

  • 一种非常基本的算法形式,可以实现您想要的:

            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]);
            }
    
    int[]iArray={1,2,3,2,3,4,3};
    int[]newArray=newint[iArray.Length];
    //使用标记初始化数组
    for(int i=0;i
    以下是一种使用两个嵌套的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);
        }
    }
    
    var数组=newint[]{1,2,3,2,3,4,3};
    var result=新列表();
    foreach(数组中的变量项)
    {
    bool-found=false;
    foreach(结果中的var resultItem)
    {
    如果(resultItem==item)found=true;
    }
    如果(!找到)
    {
    结果.添加(项目);
    }
    }
    

    如果不想使用
    列表
    ,则需要使用第一个数组的大小创建一个临时数组。然后,当处理完毕后,您需要跟踪实际找到的项目数量,并将其复制到新阵列中。

    好的,您说过不需要任何内置内容,所以让我们从头开始

    有两种方法(我知道)可以做到这一点。一个具有复杂性O(n^2),另一个具有复杂性O(n+n*log(n))。第二个更快,但第一个更容易

    较慢(但更容易)的解决方案:O(n^2)

    int[]iArray={1,2,3,2,3,4,3};
    列表唯一=新列表(iArray.Length);
    
    对于(inti=0;i,只需填写字典并使用键作为结果数组

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

    这是解决方案:

    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");
    }
    
    int[]iArray={1,2,3,2,3,4,3};
    int[]EachWords={1,2,3,2,3,4,3};
    for(int p=0;p

    现在,如果您先订购项目,它将显示
    1、2、3、4
    ,然后与下一个进行比较,您将获得nlogn成本

    算法:

  • 顺序数组

  • foreach元素 如果(has_next&&next等于)删除元素; 下一个

  • 打印阵列


  • 如果空间成本不是问题,你可以使用辅助哈希表结构。但我一直认为我的想法更简单。

    你也可以使用字典,它比arrayList更快

        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);
    
    
    
        }
    
    使用字典(int[]n)删除公共字典
    {
    字典编号=新字典();
    对于(int i=0;i
    此解决方案采用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);
            }
        }
    }       
    
    var myval=[1,2,3,4,4,5,5,6,7];
    var tempVal=[];
    var l=myval.length;
    对于(var i=0;i
    static void Main(string[]args)
    {
    int[]数组=新的int[]{4,8,4,1,1,4,8
    
        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);
    
    
    
        }
    
    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);
            }
        }
    }       
    
    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();
            }
    
    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]);
            }
    
    int[] oldArray = { 1, 2, 3, 3, 4}; int[] newArray = oldArray .Distinct().ToArray();
        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);