数组+排序--知识点总结

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        canvas{
            border: 1px solid black;
            background-color: #CCCCCC;
            display: block;
            margin: 0 auto;
        }
    </style>

</head>
<body>
<canvas width="600px" height="400px"></canvas>
<script>
    var myCanvas = document.querySelector("canvas");
    var ctx = myCanvas.getContext("2d");

    //1、返回数组中出现次数最多的字符
    function delMul(arr) {
        let obj = {};
        arr.forEach((item,index) => {
            if (!obj[item]){
                obj[item] = 1;
            }else {
                obj[item]++;
            }
        });
        let maxChar,
            maxValue=1;
        for (let k in obj){
            if(obj[k] > maxValue){
                maxChar = k;
                maxValue = obj[k];
            }
        }
        return maxChar;

    }
    // let arr = ['a','a','a','b','c','d','d','d','e','d','a'];
    // console.log(delMul(arr))

    //2、快速排序===选取一个参考元素,大于该参考元素的压入右边数组,小于该元素的压入左边数组,
    //对左右边数组递归进行上一次左右边数组的操作,最后返回合并后的数组
    function quickSort(arr) {

        if (arr.length <= 1){
            return arr;
        } 
        
        let leftArr = [],
            rightArr = [];
        let temp = arr[0];

        for(let i=1;i<arr.length;i++){   //!!!!从1开始循环
            if(arr[i] > temp){
                rightArr.push(arr[i]);
            }else{
                leftArr.push(arr[i]);
            }
        }
        return [].concat(quickSort(leftArr),[temp],quickSort(rightArr))
    }

    //3、冒泡排序====相邻元素进行比较互换位置,一轮结束最后一个元素是数组最大值;
    //外层循环为比较轮数,轮数为数组长度减一:arr.length-1
    //内层循环为每轮的比较次数,==arr.length-1-轮数;轮数每增加一轮,该轮最大值确定一个,相应的比较次数减少一次
    function bubbleSort(arr){
        for (var i=0;i<arr.length-1;i++){ //轮数 :n-1
            for(var j=0;j<arr.length-1-i;j++){ //比较次数 :n-1-i
                if(arr[j] > arr[j+1]){
                    let temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        return arr;
    }

    //4、不借助临时变量,进行两个整数的互换;思想:利用+-进行计算
    function swap(a,b){
        a = a-b; //两数之差, b未变
        b = b+a; //未变b+两数之差=原a
        a = b-a; //已变b-两数之差=原b

        return [a,b];
    }

    //5、斐波那锲数列=黄金分割数列,主要考察递归的调用;定义:fibo[i] = fibo[i-1] + fibo[i-2];例如:0,1,1,2,3,5,8,13,21,34,56......
    //使用canvas绘制一个有限度的斐波那锲数列的曲线
    //1、生成斐波那锲数列数组;2、用canvas绘制
    //相似问题:生成斐波那锲数组、计算斐波那锲数列第n项
    function fibo(n){
        let fiboArr = [0,1];
        let res;
        while(n>2){
            res = fiboArr[fiboArr.length-1] + fiboArr[fiboArr.length-2];
            fiboArr.push(res);
            n--;
        }
        return fiboArr;
    }
    function fibona(n){
        let fiboArr = [];
        let i = 0; //初值
        
        while(i < n){
            if (i<=1){
                fiboArr.push(i)
            } else{
                let res = fiboArr[fiboArr.length-1] + fiboArr[fiboArr.length-2];
                fiboArr.push(res);
            }
            i++;
        }
        return fiboArr;
    }
    //6、求一个正数组的最大差值====最大值与最小值之差
    function getMaxDiff(arr){
        let minValue = arr[0]; //假设数组中最小值为第一个元素
        let maxValue = arr[0];
        let maxDiff = 0; // 声明最大差值变量,默认为0
        for(var i = 0;i < arr.length;i++){
            minValue = Math.min(minValue,arr[i]); //当前值与最小值进行比较,得到较小者
            maxValue = Math.max(maxValue,arr[i]); //当前值与最大值进行比较,得到较大者
        }
        maxDiff = maxValue - minValue;
        return maxDiff;
    }
    function getMaxDiff2(arr){
        let minValue = arr[0]; //假设数组中最小值为第一个元素
        let maxDiff = 0; // 声明最大差值变量,默认为0
        for(var i = 0;i < arr.length;i++){
            minValue = Math.min(minValue,arr[i]); //当前值与最小值进行比较,得到较小者
            curDiff = arr[i] - minValue; //当前差值
            maxDiff = Math.max(curDiff,maxDiff); //  当前差值与最大差值进行比较,取较大者
        }
        return maxDiff;
    }

    //7、指定字符串长度,生成随机字符串
    function getRandomStr(n){
        let ele = "abcdefghijklmnopqrstuvwxyz0123456789";
        let strArr = []; //字符串数组
        let eleLength = ele.length;
        let str;
        for(let i=0;i<n;i++){
            let index = Math.floor(Math.random()*eleLength); //获取随机索引0--35
            strArr.push(ele[index]);
        }
        str = strArr.join(""); //str = strArr.push(ele).join("") ====> str += ele;直接拼接
        return str;
    }
    //8、获取指定范围内的随机数,如(min,max)
    function getRandom(min,max){
        return Math.floor(Math.random()*(max - min) + min); //不包含最大值,(max-min+1)
    }
    //9、生成从0到指定值的数字数组
    function numArr(n){

        // var arr2=[],length=100,i=1;
        // for(;arr2.push(i++)<length;){} //

        let arr = [];
        for(var i = 0;i < n+1;i++){
            arr.push(i);
        }
        return arr;
    }
    //10、打乱数字数组的排列顺序
    function messArr(){
        arr.sort(function(){return Math.random()-0.5;});  //随机数(-0.5~0.5),随机的正数、零、负数,进行随机排列
    }

    //11、对象转换为数组(将对象的属性转为数组[1,2,3]、将对象的值转为数组[1,2,3]、将对象的每组键值对以对象的形式保存在数组[{1:1},{2:2},{3:3}])
    //11.1
    function objToArr(obj){
        let keyArr = [],
            valueArr = [],
            objArr = [];
        for(let key in obj){
            objUnit = {};
            keyArr.push(key);  //属性数组
            valueArr.push(obj[key]); //值数组
            objUnit.key = obj[key];
            objArr.push(objUnit); //对象数组
        }
        // return keyArr;
        // return valueArr;
        return objArr;
    }
    //11.2
    function objToArr2(obj){
        let objArr1 = [].slice.call(obj);   //obj必须为  {0:"a",1:"b",2:"c",length:3}  格式
        let objArr2 = Array.prototype.slice.call(obj);
        return objArr2
    }

    //12、验证是否为数组
    function isArray(arr){
        return Object.prototype.toString.call(arr) === '[object Array]';
    }

    //13、获取数组中的最大值或最小值
    function getMaxOrMin(arr){
        return {
            max: Math.max.apply(null,arr.join(",").split(",")), //Math.max.apply(null,arr)
            min: Math.min.apply(null,arr.join(",").split(",")),
        }
    }

    //14、保留指定小数
    function toFixed(num){
        return num.toFixed(3);  //保留3位小数
    }

    //15、不要使用delete直接删除数组中的元素,删除元素赋值为undefined,数组长度保持不变
    //可以通过splice()删除数组中的某一项

    //16、生成指定长度的随机字母数字字符串  Math.random().toString(36).substr(2)===(0,1)=> 36进制 => 去除小数随机字符串
    function getRandomStr(len){
        let str = "";
        for (;str.length < len; str+=Math.random().toString(36).substr(2));
        return str.substr(0,len);
    }

    //17、如果 obj!=null ,那么obj 不为 undefined && null ;
    //18、找出数组中出现次数最多的元素,并给出其出现多的位置
    function mostEleInArr(arr){
        //对象,属性为数组中每个元素,值为数组,保存每个元素的索引
        let obj = {};
        let curEle;
        for(let i = 0; i < arr.length; i++){
            curEle = arr[i];
            if(obj[curEle] == null){
                obj[curEle] = [];
            }
            obj[curEle].push(i);
        }
        //出现次数最多的元素
        let mostEleTimes = 0;
        let mostEle;
        for (let key in obj){
            if(obj[key].length > mostEleTimes){
                mostEleTimes = obj[key].length;
                mostEle = key;
            }
        }
        return [mostEle,obj[mostEle]];
    }

</script>
</body>
</html>

 

posted @ 2019-08-19 14:47  红桃七716  阅读(238)  评论(0编辑  收藏  举报