程序删除int数组中的重复项
我已经编写了一些代码来从Integer Array中删除重复项。 我不想使用任何内置的关键字/属性。
这是我的逻辑:
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,请包含关键字。 谢谢你的回复。
谢谢。
由于这是一个家庭作业,我不会修复你的代码,而是给你一些笔记:
- 您将无法使用单个循环并且没有内置函数来执行此操作; 你需要两个嵌套循环
- 找到重复值时,将数组项向前移动一个,并减小数组“活动区域”的大小; 你需要另一个嵌套循环来进行移动。
这是使用两个嵌套的foreach循环来实现它的方法:
var array = new int[] {1,2,3,2,3,4,3}; var result = new List(); foreach(var item in array) { bool found = false; foreach(var resultItem in result) { if(resultItem == item) found = true; } if(!found) { result.Add(item); } }
如果您不想使用List
,则需要创建一个具有第一个数组大小的临时数组。 然后,当处理完毕后,您需要跟踪您真正找到的项目数量并将其复制到新arrays中。
问题是你只是将每个元素与前一个元素进行比较。 由于这是一项自学练习,我只是概述一下如何做,并让你弄清楚细节。
您需要两个嵌套循环:
- 第一个循环遍历每个元素。
- 第二个循环将当前元素与您到目前为止看到的所有其他元素进行比较。
请注意,这需要O(n 2 )时间。
您可以使用其他方法更快地完成此操作:
- 首先对输入进行排序:O(n log(n))时间
- 使用
HashSet
或Enumerable.Distinct
:O(n)时间。
但是这些后一种方法可能都不受你不使用内置类/方法的要求所禁止。
只需填写字典并使用Keys作为结果数组。
Dictionary dict = new Dictionary(); for(int i = 0; i < array.Length; i++) { dict[array[i]] = 0; }
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 tmp = new List (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
算法的一种非常基本的forms,可以实现您想要的:
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]); }
好吧,你说你不想要内置任何东西,所以让我们从头开始做所有事情。
有两种方法(我知道)可以做到这一点。 一个具有复杂度O(n ^ 2),一个具有复杂度O(n + n * log(n))。 第二个更快,但第一个更容易。
更慢(但更容易)的解决方案:O(n ^ 2)
int[] iArray = {1,2,3,2,3,4,3}; List unique = new List (iArray.Length); for(int i = 0; i
更快(但更复杂)的解决方案:O(n + n * log(n))
int[] iArray = {1,2,3,2,3,4,3}; List unique = new List (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
如果您先订购商品,并且在与下一个商品进行比较后,您将获得nlogn成本。
算法:
-
订单数组
-
foreach elem if(has_next && next is equal)remove element; 下一个
-
打印arrays
如果空间成本不是问题,你可以使用辅助哈希表结构。 但我一直认为我的想法更简单。
您还可以使用比arrayList更快的Dictionary
public Dictionary removeDupUsingDictionary(int[] n) { Dictionary numbers = new Dictionary(); 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 dictionary = new Dictionary(); int size = n.Length; ArrayList actual = num.removeDup(n); num.removeDupUsingDictionary(n); }
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(); }
您可以使用.Distinct()扩展方法,如下所示,
int [] oldArray = {1,2,3,3,4}; int [] newArray = oldArray .Distinct()。ToArray();
int[] iArray = { 1, 2, 3, 2, 3, 4, 3 }; List unique = new List (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]); }
你的ans是:
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);
这个解决方案是在javascript中。
var myval = [1, 2,3, 4, 4, 5, 5, 6, 7]; var tempVal = []; var l = myval.length; for(var i=0; i