zoukankan      html  css  js  c++  java
  • 去重和排序

    数组去重

    方法一:

    var arr = [1,1,1,2,2,44,55,3,3];
    var newArr = [];
    for(var i = 0; i < arr.length; i++){
        var cur = arr[i];
        if (newArr.indexOf(cur) === -1) {
            newArr.push(cur);
        }
    }
    console.log(newArr);
    

    方法二:

    function fixArray(arr) {
        var obj = {};
        for (var i = 0; i < arr.length; i++) {
            var cur = arr[i];
            if (obj[cur] == cur) {
                arr[i] = arr[arr.length - 1];
                arr.pop();
                i--;
                continue
            }
            obj[cur] = cur;
        }
        return arr
    }
    var arr = [1, 2, 3, 4, 56, 3, 2, 1, 1, 2, 3];
    fixArray(arr);
    

    方法三:ES5与ES6,ES7等方法

    array.filter(function(item,index,ary){
        return ary.indexOf(item)===index;
    })
    以上所有的方法都无法处理NaN的问题,前两种无法去重,后一种直接删掉了NaN
    或者
    [...new Set([array])];//可以处理NaN问题
    

    方法四:可以去重数组中基本数据类型的值

    function noRepeat(arr){
        let ary=[],obj={};
        for(let i=0,len=arr.length;i<len;i++){
            if(!(obj[arr[i]+typeof arr[i]])){
                ary.push(arr[i]);
                obj[arr[i]+typeof arr[i]]=1;
            }
        }
        return ary;
    }
    

    其他方法:字符串去重并记录重复数目

    function unique(string){
    let n=0,str='';//n记录重复的个数,str新的字符串
    for(let i=0;i<string.length;i++){
    	if(string[i]==str[str.length-1]){
    		n++;
    	}else{
    		if(n>0){
    			str+=n+1;
    			n=0;
    		}
    		str+=string[i];
    	}
    	return str;
        }
    }
    
    

    冒泡排序

    当前项和后一项进行比较,如果当前项大于后一项就交换位置

    function bubbleSort(arr) {
        var flag = false;
        // 控制比较轮数
        for (var i = 0; i < arr.length - 1; i++) {
            flag = false;
            // 控制比较次数
            for (var j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    arr[j] = arr[j] + arr[j + 1];
                    arr[j + 1] = arr[j] - arr[j + 1];
                    arr[j] = arr[j] - arr[j + 1];
                    flag = true;
                }
            }
            if (!flag) {
                return arr;
            }
        }
    };
    
    var arr = [5, 65146, 56, 95, 112, 1, 69, 854, 8, 77, 438];
    console.log(bubbleSort(arr));
    

    快速排序

    var ary=[98,88,16,4,33,28];
    

    思路:

    1. 求出中间值的索引;
    2. 通过索引找到中间值;4;
    3. 创建两个数组:left; right;
    4. 遍历数组中的每一项,让每一项跟4中间值进行比较;比他大的,放右边,比他小的放左边;
    5. left.concat(16,right)
    6. --函数自己调用自己;--递归
    7. 停止拆分的条件:当数组的长度<=1的时候;直接返回数组
    function quickSort(ary) {
        //停止拆分的条件;-如果满足停止拆分,阻断后续代码的执行
        if (ary.length <= 1) {
            return ary;//return:1)返回值 2)阻断程序执行;
        }
        //1.求出中间值的索引;
        var point = Math.floor(ary.length / 2);
        //2.通过索引找到中间值;4;
        var pointValue = ary.splice(point, 1)[0];
        //3.创建两个数组:left=[]; right=[]
        var left = [];
        var right = [];
        //4.遍历数组中的每一项,让每一项跟16中间值进行比较;比他大的,放右边,比他小的放左边;
        for (var i = 0; i < ary.length; i++) {
            ary[i] > pointValue ? right.push(ary[i]) : left.push(ary[i]);
        }
        return quickSort(left).concat(pointValue, quickSort(right));
    }
    var arr = [5, 65146, 56, 95, 112, 1, 69, 854, 8, 77, 438];
    console.log(quickSort(arr));
    

    插入排序

    var ary=[98,88,16,4,33,28];
    

    思路:

    1. 先拎出一个数组; ary.splice(0,1)=>[98]
    2. 遍历ary数组中的每一项;分别跟[4,16,28,88,98]数组进行比较:

    插排的核心:拿ary数组中的每一项,跟left数组从后往前的比较,比他小,继续往前比较,比他大,放到他下一项的前面。

    function insertSort(ary) {
        //1.先拎出一个数组;
        var left = ary.splice(0, 1);
        //2.拿ary数组中的每一项,跟left数组从后往前的比较,比他小,继续往前比较,比他大,放到他下一项的前面;
        for (var i = 0; i < ary.length; i++) {
            var cur = ary[i];
            for (var j = left.length - 1; j >= 0;) {
                if (cur < left[j]) {
                    j--;
                    //判断比到头了
                    if (j == -1) {
                        left.unshift(cur);
                    }
                } else {
                    left.splice(j + 1, 0, cur);
                    break;
                }
            }
        }
        return left;
    }
    var arr = [5, 65146, 56, 95, 112, 1, 69, 854, 8, 77, 438];
    console.log(insertSort(arr));
    
  • 相关阅读:
    玲珑杯 1035 D-J
    多项式exp
    Thanks to World
    【uoj#191.】Unknown
    【bzoj4534】基础排序算法练习题
    【bzoj4596】黑暗前的幻想乡
    【bzoj2893】征服王
    【bzoj3876】支线剧情
    【bzoj4283】魔法少女伊莉雅
    【bzoj1822】冷冻波
  • 原文地址:https://www.cnblogs.com/Juphy/p/6959189.html
Copyright © 2011-2022 走看看