在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
资料:
js世界-数组去重到底最快的是谁?
RemoveduplicatevaluesfromJSarray[duplicate]
大致思路
遍历数组的各个项并判断某项是否重复。时间复杂度往往是O(n^2)
优化:通过object,或者set,借助散列表查找的优秀性能来降低复杂度
下面记录几种方法
去重的是单一基础类型(number)可以用遍历+obj-keys
如果有多类型的话,可能会出现
1和字符串'1'被认为是重复的问题
functionmerge2Array5(origin){
constresult=[];
consttagObj={};
for(constioforigin){
if(!tagObj[i]){
result.push(i);
tagObj[i]=1;
}
}
returnresult;
}
去重的是多种基础类型
用for+set
functionmerge2Array6(origin){
constresult=[];
constset=newSet();
for(constioforigin){
if(!set.has(i)){
result.push(i);
set.add(i);
}
}
returnresult;
}
代码量少的写法
//方法1
functionmerge2Array4(origin,target){
returnArray.from(newSet([...origin,...target]))
}
//方法2
functiononlyUnique(value,index,self){
returnself.indexOf(value)===index;
}
//usageexample:
vara=['a',1,'a',2,'1'];
varunique=a.filter(onlyUnique);//returns['a',1,2,'1']
最后
stackoverflow的回答上有句话:
However,ifyouneedanarraywithuniqueelements,whynotusesetsrightfromthebeginning?
hhhhhhh:D
关于可变长数组(VLA)的问题:原来的C89标准中是不允许可变长数组出现的,但是在C99标准中,加入了对VLA的支持,但是支持的编译器不多,而且由于栈溢出的安全问题,没有太多的人敢用这个可变长数组,所以在C11标准中又把它规定为可选实现的功能了。
¥39.00
¥99.00
¥59.00