Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

第 04 题:经典题——数组去重与数组取重 #4

Open
doubleyao5753 opened this issue Jul 24, 2019 · 8 comments
Open

第 04 题:经典题——数组去重与数组取重 #4

doubleyao5753 opened this issue Jul 24, 2019 · 8 comments

Comments

@doubleyao5753
Copy link
Owner

doubleyao5753 commented Jul 24, 2019

数组取重的N种方法

===========================================>

@doubleyao5753
Copy link
Owner Author

doubleyao5753 commented Jul 24, 2019

indexOf() + forEach() 索引不等大法

逻辑:

  • 定义结果数组——>forEach遍历数组(可以换成for循环)
  • 若数组中的每一个值从前往后的索引 不等于 从后往前的索引(等价于这个值在数组中不唯一)
  • 并且 要保证在结果数组中找不到这个值 (防止重复的值在遍历时重复push)
  • 那么就将这个值push进结果数组中
function getRepeat(arr) {
    var res = [];
    arr.forEach(function(e) {
        if(arr.indexOf(e) !== arr.lastIndexOf(e) && res.indexOf(e) == -1){
            res.push(e)
        }
    })
    return res
}

@doubleyao5753
Copy link
Owner Author

sort() for循环 排序+遍历大法

逻辑:

  •     将数组进行排序 + 定义结果数组
    
  •     for循环遍历数组,
    
  •     若 当前值与后一个值相等 并且 当前值与前一个值不等
    
  •     or 若当前值与后一个值相等 并且 结果数组中没有这个当前值
    
  •     那么,将这个值push进结果数组
    
function getRepeat2(arr) {
    arr.sort();
    var res = [];
    for(var i = 0;i < arr.length ; i++) {
        if (arr[i] === arr[i+1] && arr[i] !== arr[i-1]){
            newArr.push(arr[i])
        }
        //------------------------------------------------------
        // if(arr[i] === arr[i+1] && res.indexOf(i) == -1){
        //     res.push(arr[i])
        // }
    }
    return res
}

@doubleyao5753 doubleyao5753 pinned this issue Jul 24, 2019
@doubleyao5753
Copy link
Owner Author

数组去重的N种方法

===========================================>

@doubleyao5753
Copy link
Owner Author

@doubleyao5753
Copy link
Owner Author

双for循环去重

逻辑:
定义结果数组,两层for循环,第一层遍历原数组,第二层遍历结果数组
重点:遍历原数组前定义一个空变量
遍历原数组后将变量设为false,也就是假设没有重复
并在这个假设条件下将当前遍历的值push进结果数组中去
在push之前插入结果数组的遍历,判断原数组与结果数组的同索引遍历值是否相等
若相等,则说明有重复,将为false的变量设为true并break结束循环

function noRepeat(arr) {
    var res = []
    var isRepeat;
    for(var i=0;i<arr.length;i++){
        isRepeat = false
        for(var j=0;j<res.length;j++){
            if(arr[i] === res[j]){
                isRepeat = true
                break
            }
        }
        if(!isRepeat){
            res.push(arr[i])
        }
    }
    return res
}

@doubleyao5753
Copy link
Owner Author

filter() + indexOf() 最优解法

在数组自带的filter()方法中的函数中,用到所有元素和索引两个参数
返回一个新数组,这个新数组应该满足的条件是:
每一个元素的索引必须等于他第一次出现的索引(利用indexOf方法)
也就是说,重复出现的值将会被过滤掉

function noRepeat(arr) {
    return arr.filter(function(e,index){
        return arr.indexOf(e) === index
    })
}

@doubleyao5753
Copy link
Owner Author

doubleyao5753 commented Jul 25, 2019

forEach() + indexOf() 优秀解法

逻辑:
定义结果数组,foreach原数组
在forEach的函数中,将每一个值push进结果数组
在push之前,若在结果数组中已经有了则return停止执行(用indexOf)

function noRepeat(arr) {
    var res = []
    arr.forEach(function(e){
        if(res.indexOf(e) > -1) return
        res.push(e)
    })
    return res
}

@doubleyao5753
Copy link
Owner Author

sort() + 遍历或者forEach 优秀解法

逻辑:
定义结果数组,将原数组sort()排序
for循环或forEach,如果前一个值不等于后一个值,就将其push进结果数组
返回结果

function noRepeat(arr){
    var res = []
    arr.sort()
    for(var i=0;i<arr.length;i++){
        if(arr[i] !== arr[i+1]){
            res.push(arr[i])
        }
    }
    return res
}

@doubleyao5753 doubleyao5753 unpinned this issue Jul 28, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant