当前位置: 首页 > 编程语言 > C#

查找数组之间的重复项

时间:2023-04-10 20:33:20 C#

查找数组之间的重复项假设你有两个长度为3的整数数组,并且你始终确信给定两个数组,两个元素将具有相同的值。所以假设数组A有三个值:a、b、c。数组B具有三个值:d、e、f。我们确信其中两个值是相同的。我们被要求将这四个不同的值放在一个大小为4的数组中,这样输出数组C应该在索引1和2中具有与数组A和B相同的值,并且在索引0和3处它应该我用不同的值arraysA和B实现了它,但对这个解决方案真的不满意......有没有人有更好的解决方案?除了将我的计数器放在一个数组中的那个......?int[]a={1,201,354};int[]b={404,201,354};int[]c=新的int[4];对于(inti=0;i1;c[3]=(t-s)>>1;c[1]=(a[0]==x?a[1]:a[0]);c[2]=(a[2]==x?a[1]:a[2]);注意如果问题被泛化使得n-1个元素共享并且有一个唯一两个数组中的元素,这就是O(n)算法,而基于集合交集和/或联合的算法通常是O(nlogn):)而不是counter1、counter2、counter3:counter[3];从那里开始,很多事情都变了很容易,你可以引用循环中的所有内容。我很确定我不明白这个问题。你说:我们确定其中两个值是一样的。我们被要求提出这四种不同的价值观,你指的是哪四种不同的价值观?两者是一样的吗?因为这就是“这些”这个词所指的。你的意思是:取4个唯一值,放到一个数组中?所以:1,2,32,3,4变成:1,2,3,4?很简单:int[]c=a.Concat(b).Distinct().ToArray();这使用.NET3.5的Linq扩展方法。如果您使用的不是.NET3.5,您可以这样做:Dictionaryc1=newDictionary();foreach(a中的变量x)c1[x]=1;foreach(varxinb)c1[x]=1;int[]c=newList(c1.Keys).ToArray();现在,如果你需要顺序:第一个值只出现一次第一个值出现两次第二个值出现两次第二个值只出现一次那么恐怕我没有为你做单行,你会有多想想。我可能会问上下文是什么?为什么这个要求?我建议这是初稿,但我认为它可能需要一些改进。它也不满足在数组中位置1和2具有重复项且在0和3具有唯一数字的要求。不管我如何认为我会发布它,所以你可以知道它的外观:int[]a={1,201,354};int[]b={404,201,354};int[]c=newint[4];//首先完全复制其中一个数组。a.CopyTo(c,0);//遍历b并将每个数字与//a中的每个数字进行比较。foreach(intiinb){//假设您没有处理重复的boolfound=true;foreach(intjina){//如果找到重复项,将found设置为falseif(i==j){found=false;}}//如果您没有找到重复项,这就是您想要的//数字-将其添加到数组中。如果(发现==真){c[3]=i;}}boolisUsed[6]={true,true,true,true,true,true};整数值[6];int值计数=0;诠释我,j;for(i=0;i这部分if(a[0]==b[0]){counter0++;}if(a[0]==b[1]){counter0++;}if(a[0]==b[2]){counter0++;}if(a[1]==b[0]){counter1++;}if(a[1]==b[1]){counter1++;}if(a[1]==b[2]){counter1++;}如果(a[2]==b[0]){counter2++;}如果(a[2]==b[1]){counter2++;}if(a[2]==b[2]){counter2++;}可以重写为for(i=0;i<3;i++){for(j=0;j<3;j++){switch(i){case0:if(a[i]==b[j]){counter0++;}休息;情况1:if(a[i]==b[j]){counter1++;}休息;情况2:if(a[i]==b[j]){counter2++;}休息;}}}与其他计数器的另一部分应该类似地编写然后你可以将它重构为一个单独的方法,并将数组和计数器传递给它。另一个选择可能是LINQ,但我不确定如何写这样的东西。(没试过编译,但想法清楚吗?)更新:如果你可以把计数器放在一个数组中,这可能有效:for(i=0;i<3;i++){for(j=0;j<3;j++){如果(a[i]==b[j]){计数器[i]++;}}}我想简单回答一下。但它假设输入是正确的。诠释c1,c2,我;c1=a[0]==b[0]?0:(a[0]==b[1]?1:2);//a[0]在数组'b'中的索引c2=a[1]==b[0]?0:(a[1]==b[1]?1:2);//数组'b'中a[1]的索引for(i=0;i<2;i++)Console.WriteLine(a[i]);Console.WriteLine(b[3-c1-c2]);//看起来很hacky但它实际上是'b'的元素而不是数组'a'这是一些简单的代码,但它假设a和b中的值始终为正数。int[]a={1,201,354};int[]b={404,201,354};int[]c={-1,-1,-1,-1};for(inti=0;i我还没有测试过,但希望你明白了。这使用了很少的额外空间(只是未发现的空间,可以变成一个布尔值和一个索引变量)并且应该非常快。int[]a={204,534,1};int[]b={204,534,401};int[]c=newint[4];intx=3,y=3,k=1;for(inti=0;i<3;i++)for(intj=0;j<3;j++)if(a[i]==b[j]){c[k++]=a[i];}x-=i;y-=j;break;}c[0]=a[x];c[3]=b[y];Sapph提供了一个尽可能干净的答案,但如果性能很重要。.NET数组边界检查可能会增加一些开销,但在C中,这会编译为64条没有分支的指令。int[]a={204,534,1};int[]b={204,534,401};int[]c=新的int[4];//从a中选择不在b中的值作为c[0]//不在b中的a[0]由a[1]inb和a[2]inb隐含inta1_not_in_b=Convert.ToInt32(a[1]!=b[0]&a[1]!=b[1]&a[1]!=b[2]);inta2_not_in_b=Convert.ToInt32(a[2]!=b[0]&a[2]!=b[1]&a[2]!=b[2]);//相当于数组{0,1,2,0,1}的2位值的位域intidxs=0|1>=2*a1_not_in_b|4*a2_not_in_b;c[0]=a[(idxs>>0)&3];c[1]=a[(idxs>>2)&3];c[2]=a[(idxs>>4)&3];//从b中选取不在a中的值//b[0]不在a中由b[1]ina和b[2]ina隐含intb1_not_in_a=Convert.ToInt32(a[0]!=b[1]&a[1]!=b[1]&a[2]!=b[1]);intb2_not_in_a=Convert.ToInt32(a[0]!=b[2]&a[1]!=b[2]&a[2]!=b[2]);c[3]=b[b1_not_in_a|2*b2_not_in_a];快点?使用System.Linq;使用sw=System.Diagnostics.St观察员;classProgram{staticvoidMain(){int[]a=newint[]{1,2,3},//尝试:a={1,2,2}b={2,2,3}b=新整数[]{4,2,3},c=新整数[4];swsw=sw.StartNew();对于(inti=5000000;i>0;i--){dssd1(a,b,c);dssd1(b,a,c);}Console.Write(sw.ElapsedMilliseconds);控制台.Read();}staticvoiddssd0(int[]a,int[]b,int[]c)//6710毫秒。{int[]s=a.Intersect(b).ToArray();//同样的int[]d=a.Union(b).Except(s).ToArray();//差异c[0]=d[0];c[1]=s[0];c[2]=s[1];c[3]=d[1];}staticvoiddssd1(int[]a,int[]b,int[]c)//61毫秒。{如果(a[0]!=b[0]&&a[0]!=b[1]&&a[0]!=b[2]){c[0]=a[0];c[1]=a[1];c[2]=a[2];转到L0;}if(a[1]!=b[0]&&a[1]!=b[1]&&a[1]!=b[2]){c[0]=a[1];c[1]=a[0];c[2]=a[2];转到L0;}c[0]=a[2];c[1]=a[0];c[2]=a[1];L0:如果(b[0]!=c[1]&&b[0]!=c[2]){c[3]=b[0];返回;}if(b[1]!=c[1]&&b[1]!=c[2]){c[3]=b[1];返回;}C[3]=b[2];}}最快的?L0:c[3]=b[0]!=c[1]&&b[0]!=c[2]?b[0]://49毫秒。b[1]!=c[1]&&b[1]!=c[2]?b[1]:b[2];这个怎么样?以上就是C#学习教程:查找数组之间的重复项的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注---privatestaticint[]FindDuplicates(int[]arrA,int[]arrB){varaList=new列表();数组排序(arrA);数组排序(arrB);for(inti=0;i侵权,请点击右边联系管理员删除如转载请注明出处: