new Map()的用法
本质是键值对
创建map
var mymap = new Map() // 创建空map
var map2 = new Map([[1,2],[true,3]]) // 有初始参数的map
map的 方法
has -- 判断是否有这个键
set -- 添加新键值
get -- 获取map某个键的值
delete -- 删除map某个元素
clear -- 清空map
size -- 返回map的成员数量
相关链接:http://t.csdn.cn/iySz2
Math.floor
Math.floor(x) 中x可以使一个数值,也可以是一个表达式。返回值小于等于x,且与x最接近的整数。
console.log(Math.floor(5/3)); //返回值为 1
链表的定义、赋值与取值
定义链表ListNode时
链表的首个值不能为0,当首个参数为0时,代表着链表为空。
只需要定义一个ListNode xx = new ListNode(0);即可。即只定义一个空链表。
不需要定义长度 。
赋值时
通过xx.next = new ListNode(4);来赋值,注意此时是赋值给下一个指针指向的位置,此时此链表一个值,值为4。
取值时
取第一个值时,只需要xx.val即可。
取第二或之后的值时,需要xx = xx.next;int x = xx.val;这个方式取值。
结合leetcode的第二题 两数相加
es6---new Set()
类似数组,但它的一大特性就是所有元素都是唯一的,没有重复的。可以利用这一特性进行数组的去重工作。
set()中的元素是有序的,
map是无序的,需要用到key去帮助索引,所以map()的key是有序的
有序的话,底层原理基本都是平衡二叉搜索树
常用方法
添加元素 add()
let list=new Set();
list.add(1)
删除元素 delete(),删除数值
判断某元素是否存在 has(),有返回true,无返回false
清除所有元素 clear()
遍历 keys()
letlist2=newSet(['a','b','c'])
for(letkeyoflist2.keys()){
console.log(key)//a,b,c
}
遍历 values()
letlist=newSet(['a','b','c'])
for(letvalueoflist.values()){
console.log(value)//a,b,c
}
遍历 foreach()
letlist=newSet(['4','5','hello'])
list.forEach(function(item){
console.log(item)
})
数组转set(用于数组去重)
letset2=newSet([4,5,6])
set转数组
letset4=newSet([4, 5, 6])
//方法一 es6的...解构
letarr1= [...set4];
//方法二 Array.from()解析类数组为数组
letarr2=Array.from(set4)
charAt()
charAt()方法是可返回指定位置的字符,语法为【stringObject.charAt(index)】,其中index表示字符串中某个位置的数字,即字符在字符串中的下标。
字符串中的第一个字符的下标是0,如果参数 index 不在 0 与 string.length 之间,该方法将返回一个空字符串。
slice()
通过索引位置获取新的数组,该方法不会修改原数组,只是返回一个新的子数组。
用法:arrayObj.slice(start,end)
例1:获取仅包含最后一个元素的子数组
var arr=[1,2,3,4,5];
arr.slice(-1);//[5]
例2:获取不包含最后一个元素的子数组
var arr=[1,2,3,4,5];
arr.slice(0, -1);//[1,2,3,4]
例3:获取包含 从第二个元素开始的所有元素的子数组
var arr=[1,2,3,4,5];
arr.slice(1);//[2,3,4,5]
join()
用join函数将数组内的元素连接起来形成新的数组。
若为 join(""),则是以字符串的形式生成一个新的数组元素
例如:给数组中每个元素用“."连接
let arr=[255,444,222,1]
arr=arr.join(".")
//返回的是 arr=[255.444.]
对象的key:value && 多层数组
对象
通过提取preson中的 key 值来进行解构提取
var preson = {Firstname : "John" , id : 555 , lasename : 'Doe'}
const {Firstname} = preson //通过提取preson中的 key 值来进行解构提取
多层数组
通过这种多层数组的方法可以成功的在for循环中充当循环的条件,并且每一个都可以比较的到
像这种方法,也可以通过比较 前一个 value 的值,来赋予新的数组元素 symbol
var changeNum = [[1000, "M"], [900, "CM"], [500, "D"], [400, "CD"], [100, "C"], [90, "XC"], [50, "L"], [40, "XL"], [10, "X"], [9, "IX"], [5, "V"], [4, "IV"], [1, "I"]]
for(const [value,symbol] of changeNum){...}
//通过这种多层数组的方法可以成功的在for循环中充当循环的条件,并且每一个都可以比较的到
sort()
采用原地算法对数组进行排序,并返回数组。默认排序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的。
语法:arr.sort((a,b)=>{ return })
实例---给数字数组排序
升序,正常运用sort函数时,也是用 a, b 来告诉大家是用升序还是降序
arr.sort((a, b) => {
return a - b
})
或者写成
arr.sort((a,b)=> a-b)
降序
arr.sort((a, b) => {
return b - a
})
实例-----给对象数组按照某个属性排序
具体看链接 http://t.csdn.cn/M2EJz
abs()--返回一个树的绝对值
Number.MAX_SAFE_INTEGER
表示js中的最大的安全整数
数组方法--shift()
用于把数组的第一个元素从其中删除,并返回第一个元素的值
queue=[1,2,3,4,5],
constcurStr=queue.shift()//curStr=1
queue//此时的queue=[2,3,4,5]
unshift()
在数组开头添加新元素(可以代替需要反转数组的情况,减少运算时间),返回值为数组的新长度
unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。
参数一必选,若要多添加几个就加几个元素
arrayObject.unshift(newele1,newelet2,…,neweleX)
提示:要把一个或多个元素添加到数组的尾部,请使用 push() 方法
构建新数组的方法(对象的取值)
constdigits='23'
constmap= { 2:'abc', 3:'def', 4:'ghi'}
for(leti=0;i<2;i++){
constletters=map[digits[i]]
}
//此时的letters 就是从map对象中取出key值跟digist[i]对应相等的值 ,就是 怎么从 js 对象中取出相应的 key 对应的 value
二分法
letstart=0;
letend=nums.length-1;
// >> 1 相当于除以2向下取整
letmid= (start+end)>>1;
Array from() == [...数组] ==slice(数组)
此方法可以将一个类数组对象或者可遍历的对象转换成一个真正的数组
题目说到的三种方法都可以得到一个新的数组,但slice不能放任何参数,才会把原本所有的数组给放进去
Array from()具体参考链接http://t.csdn.cn/78Tyj
创建二维数组
表示数组是m行n列的二维数组
//创建m行n列的数组并赋予“0”
方法一:
newArray(m).fill(newArray(n).fill(0)
方法二:
Array.from(Array(m+1), () =>Array(n+1).fill(0));
//单单只是创建了一个m行n列的数组
或者 Array(m).fill().map(item=>Array(n))
创建数组并赋值
//创建dp为n+1长的数组,并都赋值为0
//需要累加的,则应该用像这样定义一个数组
letdp=newArray(n+1).fill(0);
reduce
数组求和
letarr= [1,2,3,4,5]
console.log(arr.reduce((a,b) =>a+b)) // - 15
console.log(arr.reduce((a,b) =>a*b)) // - 120
"/" && floor &&排序求和往小取整初始化数组
floor是数学里往小取整
let sum = 23
sum/2 // 11.5
Math.floor(sum/2) //11
例
//sort 排序
stones = stones.sort((a,b)=>a-b)
//reduce 求和
const sum = (stones.reduce((a,b)=>a+b))
//floor 往小取整
const n = stones.length, m = Math.floor(sum / 2);
//创建数组并初始化为0
const dp = new Array(m+1).fill(0)
遍历给出的一维数组中的每个元素,且遍历每个元素中的里面一些元素
例如给出的数组为
strs = ["10", "0001", "111001", "1", "0"],计算出每个元素有多少个1和多少个0
这就是遍历一维数组的元素遍历,具体如下
strs = ["10", "0001", "111001", "1", "0"]
let x,y
for(let str of strs){//第一层for循环是遍历数组中的元素
x=0;
y=0;
for(let c of str){//第二层for循环时遍历元素中的元素
if(c==='0'){
x++;
}else{
y++;
}
}
}
完全背包
完全背包指的是每个物品可以用无数次
//先遍历物品或者背包都可以
//完全背包时正序遍历,指的是每个物品可以无限使用,
//零一背包的第二个循环得是倒序,为了保证每个物品只能用一次
for(let i = 0; i<物品数量; i++){ //遍历物品
for(let j = weight[i]; j<=bigweight; j++){//正序遍历背包,
}
分割字符串
s为传入的字符串
// 传入的是分割字符串的截取片段,传入的是为回文数的字符串s[startIndex,i]
path.push(s.slice(startIndex,i+1))
substr--截断字符串
语法
stringObject.substr(start,length)
还可以用来截断日期
例如:
<script type="text/javascript">
var time ="2019-02-26 14:27:56";
var timeAfter = time.substr(0,11);
console.log(timeAfter);
</script>
显示:
2019-02-26
贪心算法
由局部最优推出全局最优
max
可以用这个记录两者之间哪个数最大
初始化变量为Infinity
在涉及数字比较的算法时,可以使用Infinite初始化变量,用例是寻找数组的最小值。
具体用法可以参照如下链接https://dmitripavlutin.com/infinity-in-javascript/
isNaN()
isNaN() 函数用于检查其参数是否是非数字值。
如果参数值为 NaN 或字符串、对象、undefined等非数字值则返回 true, 否则返回 false。
isNaN(value)
reverse()
reverse() 方法用于颠倒数组中元素的顺序。
split()
string.split(separator,limit)
separator 分割字符或者正则(可选)
limit 返回的数组的最大长度(可选)
split() 方法用于把一个字符串分割成字符串数组。
返回值:以数组的形式返回
实例1(缺省分隔符)
var str = "hello world!hello man!how are you!";
var arr = str.split();
console.log(arr)
》["hello world!hello man!how are you!"]
实例2 以空格来分割
var str = "hello world!hello man!how are you!";
var arr = str.split(" ");
console.log(arr)
》["hello", "world!hello", "man!how", "are", "you!"]
实例3 每个字符作为数组的元素进行分割
var str = "hello world!hello man!how are you!";
var arr = str.split("");
console.log(arr)
》["h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d", "!", "h", "e", "l", "l", "o", " ", "m", "a", "n", "!", "h", "o", "w", " ", "a", "r", "e", " ", "y", "o", "u", "!"
这一块的知识参照:http://t.csdn.cn/RRuSR
Math.random()
返回大于等于0小于1的一个随机数
Math.floor()
向小取整
Math.ceil()
向大取整
返回1-10之间一个随机整数
var rand1 = Math.floor(Math.random() * 10 + 1);
for...in for...of
for...in一般遍历对象,for...in的i得到键名,presonArr[i]得到键值
for...of一般遍历数组或用forEach遍历数组,for...of的i得到键值,personArr[i]为undefined
用for循环遍历对象的属性时,通常有两种方法
for(let i in Arr)==>此时的 i 循环的是key或者索引
for(let i of Arr)==>此时的 i 循环的是value
for...in循环出的是key,for...of循环出的是value
for...of是es-6新增的迭代器