前端一些算法&日常实践
前端拖拽
Document - 锐客网 body{
margin:0;
padding:0;
}
.box{
background-color: aquamarine;
width: 100px;
height: 100px;
position: absolute;
top:0;
left:0;
cursor: move;
}
大数相加
function add(str1,str2){
let num1 = str1.split('').reverse();
let num2 = str2.split('').reverse();
console.log(num1, num2)
let nextNum = 0;
let total = [];
for(let i = 0;
i < num2.length;
i++){
let curNum = 0;
if(num1[i]){
curNum = Number(num1[i]) + Number(num2[i]) + Number(nextNum);
if(curNum >= 10){
nextNum = String(curNum)[0];
total.push(String(curNum)[1]);
} else {
nextNum = 0;
total.push(curNum)
}
} else {
curNum = Number(num2[i]) + nextNum;
if(curNum >= 10){
nextNum = String(curNum)[0];
total.push(String(curNum)[1]);
} else {
nextNum = 0
total.push(curNum)
}
}
}
return total.reverse().join('');
}let d = add(
"123456789123456789123456789123456789123456789123456734",
"1241519123456789123456789123456789123456789123456789123451234567891")
数组去重
去重
let arr = [12, 23, 12, 15, 25, 23, 25, 14,16];
let a = Array.form(new Set(arr))
let b = [...new Set(arr)]let newArr = [];
// 第一种方案
// 拿出当前项和后面的进行比较,只需要length -1 项和后面比较
for(let i = 0;
i < arr.length - 1;
i++){
let item = arr[i];
args = arr.slice(i+1);
// 当前项后的所有数据
if(args.indexof(item) > -1){
// 如果当前项目包含可以删除,也可以放入新数组
// 第二种
// arr.splice(i,1);
// splice 原来数组改变,如果i++,则会数组塌陷
// 性能不好,当前项删除,后面索引都要改变
// i--;
//第三种
// arr[i] = null;
// arr[i] = arr[arr.length -1];
// arr.length --;
// i--;
} else {
// newArr.push(item)
}
}// arr.filter(item => item !== null);
// 对象键值对, 那数组的每项向新容器中存,如果有把当项干掉
// let obj = {}
// for(let i = 0;
i < arr.length;
i++){
//let item = arr[i];
//if(typeof obj[item] !== 'undefined'){
//arr[i] =arr[arr.length - 1];
//arr.length--;
//i--;
//continue;
//}
//obj[item] = item;
// }
// console.log(arr);
排序
冒泡排序
文章图片
function Bubble(arr){
let temp = null;
for(let i = 0;
i < arr.length-1;
i++){
for(let j = 0;
j < arr.length-1-i;
j++){
if(j[i] > j[i+1]){
// 当前项大于后一项
temp = j[i];
j[i] = j[i+1]
j[i+1] = temp;
}
}
}
return arr;
}
插入排序(扑克牌)
文章图片
function insert(arr){
// 1、准备一个新数组,用来存储抓到手里的牌,开始先抓一张牌进来
let handle = [arr[0]];
// 2、从第二项开始依次抓牌,一直到台面上的牌抓光
for( let i= 1;
i< arr.length;
i++){
// a 是新抓的牌
let a = arr[i];
// 和 handle手里的牌依次比较
for(let j = handle.length -1;
j >= 0;
j--){
// 每一次要比较手里的牌, 从大到小比较
let b = handle[j];
// 如果当前新牌A比要比较的牌B大了,把A放到B的后面;
if( a > b){
handle.splice(j+1,0,a);
break;
}
//已经比到第一项, 我们把新牌放到手中最前面即可
if(j == 0){
handle.unshift(a)
}
}
}
return handle
}
【前端一些算法& 日常实践】快速排序(中间值,大右小左,依次递归,最后合并)
function quick(arr){
// 4、结束递归,当arr中小于等于一项,则不用处理
if(arr.length <= 1){
return arr
}
// 1、找到数组中的中间项,在原有的数组中把他移除
let middleIndex = Math.floor(arr.length/2);
let middleValue = https://www.it610.com/article/arr.splice(middleIndex,1)[0];
// 2、准备左右两个数组,循环剩下数组中的每一项,比当前项小的放在左边数组中,反之放到右边的数组中
let arrLeft = [];
let arrRight = [];
for(let i = 0;
i< arr.length;
i++){
let item = arr[i];
item < middleValue? arrLeft.push(item) : arrRight.push(item);
}
// 3、递归方式让左右两边的数组持续这样的处理,一直到左右两边都排好序了,(最后让左边+ 中间+ 右边拼接成为最后的结果)
return quick(arrLeft).concat(middleValue, quick(arrRight));
}
扁平化
推荐阅读
- 今天写一些什么
- 画解算法(1.|画解算法:1. 两数之和)
- Guava|Guava RateLimiter与限流算法
- 一个选择排序算法
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- 一些杂感(11)
- SG平滑轨迹算法的原理和实现
- Jsr303做前端数据校验
- 记录iOS生成分享图片的一些问题,根据UIView生成固定尺寸的分享图片
- 一些小日子