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