<!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>