删除重复元素的算法
2023-02-19阅读(434)
问:怎样用一个方法去掉一个数组的重复元素
- 答:可以使用双重循环,逐一对比元素,如有重复,则删除的方法去重。
其思路为
1、依次遍历循环中的每一个元素。
2、对于任意一个元素,依次与之前的元素进行对比,如果有重复则删除。
3、删除操作可以采用将后续元素逐个前移,达到覆盖当前元素的效果。
在此基础上可以进行一点优化,即,不需要每次删除元素均前移所有元素,而是把需要保留的元素放到"应该"放的位置即可,这样可以提高效率。
以数组为例,参考代码如下:
int remove_repeat(int *a, int l)//对起始地址为a,长度为l的数组进行去重,新的长度以形式返回。
{
int i,j, r=0; //i,j为循环下标,r为去重后元素总数,初始值为0
for(i = 0; i < l; i ++)
{
for(j = 0; j < r; j ++)//检查是否重复
if(a[j] == a[i]) break;
if(j == r) //没有重复元素
a[r++] = a[i]; //将当前元素放置与去重后数组的尾部,并增加去重后的总数。
}
return r; //返回新的长度。
} - 答:思路:首先想到的一个方法是遍历,将整个数组遍历一遍,如果之前没有出现过,将其放到一个新的数组中,最后返回这个数组。
function unique(array){
var n = [];//一个新的临时数组
//遍历当前数组
for(var i=0; i<array.length; i++){
//如果当前数组的第i已经保存进了临时数组,那么跳过,
//否则把当前项push到临时数组里面
if(n.indexOf(array[i]) == -1){
n.push(array[i]);
}
}
return n;
}
//判断浏览器是否支持indexOf,indexOf为ecmaScript5新方法IE8以下(包括IE8,IE8只支持部分ecma5)不支持
if(!Array.prototype.indexOf){
//新增indexOf方法
Array.prototype.indexOf = function(item){
var result = -1;
var a_item = null;
if(this.length == 0){
return result;
}
for(var i = 0,len = this.length; i < len; i++){
a_item = this[i];
if(a_item === item){
result = i;
break;
}
}
return result;
}
}
问:C语言删除一个整型数组里面重复的元素
- 答:利用双重循环,将每个值依次与其后面的值相比较,如果有相同的则删除该元素即可。
删除时,可以使用将后面元素依次向前移动一位,同时总长度减一的方式。
参考代码如下:
int remove_repeat(int *a, int l)
{
int i, j, k;
for(i = 0; i < l; i ++)
{
for(j = i+1; j <l; j ++)//对后面每个元素比较,去重。
{
if(a[j] == a[i])//发现重复元素。
{
for(k = j+1; k<l; k ++)//依次前移一位。
a[k-1] = a[k];
l--;//总长度减一。
}
}
}
return l;//返回新的长度值。
} - 答:将第一个元素输出,再后面的一个个与前面的比较,有相等的就继续循环,不等的就输出,用for语句做
- 答:int elimination(int a[], int count){ //去除数组中重复的元素
int i, j, k;
for (i = 0; i < count; i++){
for (j = i + 1; j < count; j++){
if (a[j] == a[i]){
for (k = j + 1; k< count; k++)
a[k - 1] = a[k];
count--;
j--;
}
}
}
return count;
} - 答:我跟你直接说思路吧,他们这样的双重循环数组太大的话很耗时间的,你可以,先给数组排序,然后删除多余的数就很耗操作了,只需要看相邻的数就可以了。
- 答:for(int i=0; i<length;i++){
for(int j=0; j<i;j++){
if(arr[j]=arr[i]){
for(int k=i+1;k<length;k++){
arr[k-1]=arr[k];
}
length--;
break;
}
}
} - 答:int i, j;
int buf[] = {1,2,3,3,2,1};
int count = strlen(buf);
for(i = 0; i < count; i++){
for(j = i+1; j < count; j++){
if(buf[i] == buf[j]){
buf[j] ^= buf[count];
buf[count] ^= buf[j];
buf[j] ^= buf[count];
count--;
}
}
}
buf[count] = '\0';
提供给你个思路 我没有调试,不过思路我觉得不错!
就是从数组里第一个元素开始找相同的,如果相同就把 相同元素和数组最后一位交换,下一个相同的就和数组倒数第二位交换,最后把 count位变成‘/0’,最后打印数组。
问:请问C#中有没有判断数组元素重复,或如何去除重复呀?
- 答:C#数组去除重复元素算法:
通过遍历原数组中的每一个元素,将元素添加到新的listString中,如果listString已经包含了就不添加,当遍历完原数组,泛型中保存的就是去重后的结果了。
由于需求对结果的元素序列没有任何要求,采取了下列算法来提高效率
string[] stringArray = {...因为是从文件读取的,这里省略了...}
List<string> listString =new List<string>();
Array.Sort(stringArray );//排序数组
int MaxLine = stringArray.Length;
#region 单独计算第一个
if (sourceData[0] != stringArray[1])
{
listString.Add(stringArray[0]);
}
#endregion
for (int i =1; i < MaxLine; i++)
{
if (sourceData[i] != stringArray[i-1])
{
listString.Add(stringArray[i]);
}
}
思路是:首先对数组进行排序,这样相同的数组就排列在了一起。然后遍历原数组,一次取出当前元素和上一个元素,如果2个元素相等就跳过,不相等就将其元素的保存到泛型listString中。(第一次运行的时候,前一个元素为空,所以把第一个元素单独拿出来处理)