Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript数组中查找唯一唯一值的最佳方法是什么_Javascript_Algorithm - Fatal编程技术网

在JavaScript数组中查找唯一唯一值的最佳方法是什么

在JavaScript数组中查找唯一唯一值的最佳方法是什么,javascript,algorithm,Javascript,Algorithm,就时间复杂度而言,查找数组中唯一唯一值的最佳方法是什么 示例: findUniq([2,1,1,1,1,1])应返回2 findUniq([3,4,3,3,3,3,3,3])应返回4 约束: 数组开始时有2个以上的值 数组只有数字 数组只有一个唯一值,例如[1,7,1,1]或[4,2,2,2] [3,4,5,3]不是有效的输入 我想知道我是否可以使用Set来解决这个问题 这是一个带有for循环的解决方案,我不确定这个解决方案是否能通过所有场景 let findUniq = (arr) =&

就时间复杂度而言,查找数组中唯一唯一值的最佳方法是什么

示例:

  • findUniq([2,1,1,1,1,1])
    应返回
    2

  • findUniq([3,4,3,3,3,3,3,3])
    应返回
    4

约束:

数组开始时有2个以上的值

数组只有数字

数组只有一个唯一值,例如[1,7,1,1]或[4,2,2,2]

[3,4,5,3]不是有效的输入

我想知道我是否可以使用
Set
来解决这个问题

这是一个带有for循环的解决方案,我不确定这个解决方案是否能通过所有场景

 let findUniq = (arr) => {
  for(let i = 0; i < arr.length; i++) {
    if (arr[i] !== arr[0]) {
      return arr[i]
    }
  }
}
让findUniq=(arr)=>{
for(设i=0;i
您只需创建一个计数映射,然后在映射上迭代并找到计数为1的元素

时间复杂度:O(n)

var arr=[3,4,3,3,3,3,3,3];
var map=arr.reduce((a,val)=>{
a[val]=(a[val]?a[val]+1:1);
返回a;
},{});
var结果;
Object.keys(map.forEach)((key)=>{
如果(映射[键]==1)
结果=键;
});
控制台日志(结果)使用此方法

var unique = function(xs) {
  return xs.filter(function(x, i) {
    return xs.indexOf(x) === i
  })
}
此代码重新运行所有元素而不重复 使用两个循环将数组的每个元素与其他元素进行比较,如果有另一个元素,则中断循环,否则最终重新执行

function unique(arr) {
  for(var i=0;i<arr.length;i++) {
    for (var j=i; j<arr.length; j++)
    if(arr[i] != arr[j]) continue
    if (j== arr.length) return i
    break
  }
功能唯一性(arr){

对于(var i=0;i您可以使用
find
方法,检查
indexOf
是否等于
lastIndexOf
。它将返回第一个匹配并停止循环

const uniq=arr=>arr.find((e,i)=>arr.indexOf(e)==arr.lastIndexOf(e));
log(uniq([3,4,3,3,3,3,3,3,3]);
log(uniq([1,2,3,1,2]);

log(uniq([2,1,1,1,1,1]);
我可以想出一些方法来实现这一点:

  • 使用
    集合
  • const arr=[2,1,1,1];
    常量值=新集合(arr).values().next();
    
    console.log(value.value);
    基于数组中元素#1等于元素#2的解决方案

    一行代码:
    const unique=arr=>(arr[0]==arr[1])?arr.find((x=>x!==arr[0]):(arr[0]==arr[2])?arr[1]:arr[0];

    可读性稍高:

    const unique=arr=>
    (arr[0]==arr[1])
    ?arr.find((x)=>x!==arr[0])
    :(arr[0]==arr[2])?arr[1]:arr[0];
    console.log(
    唯一([2,1,2,2]),
    唯一([2,3,3]),
    唯一([4,4,4,3]),
    独特([4])//谢谢
    
    )虽然我真的很喜欢
    .reduce
    .filter
    .find
    Set
    方法来解决这个问题,但我认为它可以更容易地解决-我不太确定在不同的情况下,这将如何转化为实际成本,我所能说的是,如果循环遇到已知的值,它会进一步跳过它检查每个新值在其找到的位置后面是否有另一个相同的值

    Object.defineProperty(Array.prototype,'uniqueValue'{
    可枚举:false,
    可配置:false,
    get:function(){
    let found=[];
    为了(让我们看看这个){
    如果(发现n)继续;
    if(this.indexOf(n,this.indexOf(n)+1)==-1)返回n;
    发现。推(n);
    }
    }
    });
    console.log([2,1,1,1,1,1].uniqueValue)
    log([3,4,3,3,3,3,3,3,3,3].uniqueValue)
    
    console.log([3,4,3,3,4,3,3,5,5,7,7,8,8,9].uniqueValue)
    是否[3,4,4,4,4,5,5,5,5,5,5]是有效输入?否,数组将只有一个唯一值。问题中的代码首先不会产生正确的结果,例如它将在[1,2,3,1,2]上失败。如何定义“最佳”?最短代码?渐近复杂度?平均运行时复杂度?请澄清:数组只能包含两个不同的值或两个以上的值吗?我的头刚才爆炸了。对于[3,4,4,4]失败@mehulmpt updatedI我很确定这会删除所有的重复项,而不是像OP所说的那样只返回唯一值。编辑答案这会找到唯一值的第一次出现,但不会回答它是否是唯一值。
    const uniq=arr.filter((e)=>arr.indexOf(e)==arr.lastinexof(e)).length==1
    @cgTag OP说“数组只有一个唯一的值。”@ChrisHappy哦,好吧。这样看起来就不那么难了,因此解决起来也就不那么有趣了。@cgTag我们要去看看挑战,PPCG的挑战!xDlength是1或大于2(似乎也适用于1)@Slai谢谢!我想尝试引用
    arr[1]
    arr[2]时会出错
    ,但没什么。再次感谢!@Slai谢谢!我要假装我有自动更正功能……>>xD