/** 条件:三个空酒瓶还一瓶酒,5个瓶盖换一瓶酒,酒 5 元一瓶,共100元 */functionbuyWine({ x =20, y =20, n =20}={}){if(x -3<0&& y -5<0){
console.log("------亲,您一共可以买"+ n +"瓶酒哦--------");}else{var _x = x,
_y = y;
n = n +(x -(x %3))/3+(y -(y %5))/5;
y =(_x -(_x %3))/3+(y -(y %5))/5+(y %5);
x =(_y -(_y %5))/5+(x -(x %3))/3+(x %3);
console.log("每一次兑换后,空酒瓶个数:"+ x,"瓶盖个数:"+ y,"总数为:"+ n);
arguments.callee({ x, y, n })// buyWine({ x, y, n })}}functioninit(totalMoney){let x =(totalMoney - totalMoney %5)/5,
y =(totalMoney - totalMoney %5)/5,
n =(totalMoney - totalMoney %5)/5;return{ x, y, n };}buyWine(init(100));
数组排序
// 冒泡排序
bubbleSort: arr =>{for(var i =0, len = arr.length; i < len; i++){for(var j = i +1; j < arr.length; j++){if(arr[i]< arr[j]){[arr[j], arr[i]]=[arr[i], arr[j]];}}}return arr;},// 插入排序
insertSort: arr =>{var temp;// temp变量用于临时存储待插入元素for(var i =1; i < arr.length; i++){// 外层循环相当于选择插入的位置
temp = arr[i];//从前往后查找插入位置for(var j = i; j >0&& arr[j -1]> temp; j--){// 内层循环和插入当前位置之前的元素进行比较
arr[j]= arr[j -1];//将大于temp的arr[j]元素后移}
arr[j]= temp;}return arr;},// 选择排序
selectSortS: arr =>{var minIndex;//定义minIndex变量用于存储每一趟比较时的最小数的下标for(var i =0; i < arr.length; i++){// 外层循环改变当前默认元素的下表
minIndex = i;for(var j = i +1; j < arr.length; j++){// 内层循环找当前最小元素的小标if(arr[minIndex]> arr[j]){
minIndex = j;}}//每轮比较后若arr[i]不是我们需要的最小那个数,则进行交换if(minIndex !== i){[arr[i], arr[minIndex]]=[arr[minIndex], arr[i]];}}return arr;},// 快速排序
quickSort: arr =>{if(arr.length <=1){// 如果数组只有一个数,就直接返回;return arr;}var num = Math.floor(arr.length /2);//找到中间数的索引值,如果是浮点数,则向下取整var newValue = arr.splice(num,1);//找到中间数的值var left =[],
right =[];for(var i =0; i < arr.length; i++){if(arr[i]< newValue){
left.push(arr[i]);//基准点的左边的数传到左边数组}else{
right.push(arr[i]);//基准点的右边的数传到右边数组}}returnquickSort(left).concat(newValue,quickSort(right));//递归不断重复比较},
数组去重复
// 自定义添加方法去重复方法 可以是各种类型// var arr3= [0, 1, '1', true, 5, true, false, undefined, undefined, null, null];
unique: arr =>{var hash ={},
result =[],
type ="",
item;for(var i =0; i <this.length; i++){
item =this[i];
type = Object.prototype.toString.call(item);// 专门用来判断字符串的类型的if(!hash[item + type]){
hash[item + type]=true;
result.push(item);}}return result;}// console.log(unique(arr3));};
数组扁平化处理
flattenOne: arr =>{var res =[];for(var i =0; i < arr.length; i++){if(Array.isArray(arr[i])){
res = res.concat(flattenOne(arr[i]));}else{
res.push(arr[i]);}}return res;},// reduce
flattenTwo: arr =>{return arr.reduce(function(prev, item){return prev.concat(Array.isArray(item)?flattenTwo(item): item);},[]);},// 扩展运算符
flattenThree: arr =>{while(arr.some(item => Array.isArray(item))){
arr =[].concat(...arr);}return arr;},
关于100盏灯的按钮
// 关于 100 盏灯的点击, 规律找 每个数的公约数(可以被开平方的数)var findOpenLight ={
arr:[],
createArr:function(){for(let i =1, l =100; i <= l; i++){this.arr.push(i)}returnthis.sqrt(this.arr)},
sqrt:function(arr){let newArr = arr.filter((item, index, arr)=>{return Math.sqrt(item).toString().indexOf('.')===-1})return newArr
}}
console.log(findOpenLight.createArr())