js基础算法,包含数组的多种用法
前言
最近和朋友谈起数据结构与算法的时候。感觉自己对此不能随心应手;特此整理篇以做复习并着手梳理知识结构;由于内容比较多,现在整理的是最为基础的内容,比如数组的各种方法和demo以及排序等等。
参考有:FreeCodeCamp,codewars, 阮一峰, 追梦子
数组去重
- 最简单
function unique(arr){
var ret = [];
for(var i=0; i<arr.length;i++){
if(ret.indexOf(arr[i]) === -1){
ret.push(arr[i]);
}
}
return ret;
}
var arrs = [1,1,2,3,4,5,3,4,6];
unique(arrs); //[1, 2, 3, 4, 5, 6]
利用indexOf()的如果在数组中没找到字符串则返回 -1。
缺点:所有主要浏览器都支持 indexOf() 方法,但是 Internet Explorer 8 及 更早IE版本不支持该方法。
- 性能最高
Array.prototype.unique2 = function(){
var hash = {},
ret = []; //hash为hash表,ret为临时数组
for(var i= 0;i<this.length;i++){
var key = typeof this[i] +this[i]; //类型(typeof(this[i]))+本身 做为下文hash表中键值对的key
if(hash[key] !== 1){ //hash中value值一般为undefined 1是下面自定义,为过滤标识
ret.push(this[i]);
hash[key] = 1; // ret数组中有的 hash中key的值设为1,作为标识,用来后续过滤使用
}
}
return ret;
}
var arrs = [1,1,2,3,4,5,3,4,6];
arrs.unique2(); //[1, 2, 3, 4, 5, 6]
数组中间位置添加数组
mistake:
function avaerageAdd(){
var arrs = [1,2,3,4,5,6,7];
var newEle = [223,666];
arrs.splice(Math.floor(arrs.length/2),0,newEle);
return arrs;
}
avaerageAdd(); // [1, 2, 3, Array(2), 4, 5, 6, 7]
correct:
function avaerageAdd2(){
var arrs = [1,2,3,4,5,6,7];
var newEle = [223,666];
arrs.splice.apply(arrs,[Math.floor(arrs.length)/2, 0].concat(newEle));
return arrs;
}
avaerageAdd2(); //[1, 2, 3, 223, 666, 4, 5, 6, 7]
- splice()注解:
- splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。
注释:该方法会直接对数组进行修改,改变原始数组。
- splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。
- 语法
arrayObject.splice(index,howmany,item1,.....,itemX)
参数 | 描述 |
---|---|
index | 必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。 |
howmany | 必需。要删除的项目数量。如果设置为 0,则不会删除项目。 |
item1, ..., itemX | 可选。向数组添加的新项目。 |
- 说明
splice() 方法可删除从 index 处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素。
如果从 arrayObject 中删除了元素,则返回的是含有被删除的元素的数组。
-
concat() 方法用于连接两个或多个数组
排序
- 快速排序:
从数组的中间拿一个值,然后通过这个值挨个和数组里面的值进行比较,如果大于的放一边,小于的放一边,然后把这些合并,再进行比较,如此反复即可。
var quickSort = function(arr){
if(arr.length <= 1){return arr}; // 如果只有一位,就没有必要比较
var pivotIndex = Math.floor(arr.length / 2); // 获取中间值的索引
var pivot = arr.splice(pivotIndex, 1)[0]; // 截取中间值
var left = []; // 小于中间值放这里面
var right =[]; // 大于的放着里面
for(var i=0; i<arr.length; i++){
if(arr[i]<pivot){ // 判断是否小于
left.push(arr[i]);
}else{
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot],quickSort(right)); // 通过递归,上一轮比较好的数组合并,并且再次进行比较。
}
var ar = [1,4,8,0,3,5,6,4,8];
quickSort(ar);
- 资料:
- 快速排序 Quicksort --阮一峰
- 目前,最常见的排序算法大概有七八种,其中"快速排序"(Quicksort)使用得最广泛,速度也较快。它是图灵奖得主C. A. R. Hoare(1934--)于1960时提出来的。
- 冒泡排序
随便从数组中拿一位数和后一位比较,如果是想从小到大排序,那么就把小的那一位放到前面,大的放在后面,简单来说就是交换它们的位置,如此反复的交换位置就可以得到排序的效果。
function sortA(arr){
for(var i=0;i<arr.length-1;i++){
for(var j=i+1;j<arr.length; j++){
var cur = arr[i]; //获取第一个值
if(cur>arr[i]){ //和后一个值比较
var index = arr[j]; // 因为需要交换值,所以会把后一个值替换,我们要先保存下来
arr[j] = cur; //交换值
arr[i] = index;
}
}
}
return arr;
}
因为一次循环只能交换一个最大的值,所以需要再套一层for循环。(双重for循环)
Reverse a String 翻转字符串
先把字符串转化为数组,在借助数组的reverse()方法翻转数组顺序,最后把数组转化成字符串
function reverseString(str){
return str.split('').reverse().join('');
}
var strs = "hello"
reverseString(strs);
- split()方法是把字符串转化成数组
- reverse() 方法翻转数组顺序
- join() 方法是把数组转化成字符串
Factorialize a Number 计算一个整数的阶乘
计算一个整数的阶乘,如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的阶乘。阶乘通常简写成n! 例如:5!= 12345 = 120
function factorialize(num){
if(num<1){
return 1;
}else{
return num*factorialize(num-1);
}
}
factorialize(5); //120
- 数学方面: 0! = 1 (0的阶乘为1) 故
factorialize(0) = 1
check for Palindromes 检查回文
如果一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样,那么这个字符串就是palindromes(回文)
如果给定的字符串是回文,返回true,反之,返回false。
function palindrome(str) {
astr = str.replace(/[^0-9A-Za-z]/g,'').toLowerCase();
bstr = astr.split("").reverse().join("");
if(astr === bstr){
return true;
}else{
return false;
}
}
var strs = "eye";
palindrome(strs);
- 也可以匹配正则改为
/[\W_]/g
和/[\ |\~|\`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\||\\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?|]/g
32个特殊字符+空格
Find the Longest Word in a Sting
找到提供的句子中最长的单词,并计算它的长度,函数的返回值应该是一个数字;
- 转化为数组,sort()按str长度排列顺序,取第一个值的length
function findLongestWord(str){
var astr = str.split(" "); // 转化成数组,(引号间必须有空格)
var bstr = astr.sort(function(a,b){ //对数组中每个元素的字符串长度进行比较,按照字符串长度由大到小的排列数组顺序
return b.length- a.length;
});
var lenMax = bstr[0].length; //取出数组中第一元素(也就是最大长度的字符串)
return lenMax; //返回长度值
}
var strs = "The quick brown fox jumped over the lazy dog";
findLongestWord(strs); //6
- sort() 方法用于对数组的元素进行排序。sort()里的函数形参(a,b),如果返回a-b,小到大排列;如果返回b-a,大到小排列;
- 转化为数组,初始化一个基值变量,用作对比和存储每次循环最大值
function findLongestWord2(str) {
myStr = str.split(" ");
var longest = 0;
for(var i=0; i<myStr.length;i++){
if(myStr[i].length > longest){
longest =myStr[i].length;
}
}
return longest;
}
var strs = "The quick brown fox jumped over the lazy dog";
findLongestWord2(strs); // 6
- 转化为数组,遍历每一个值并push到一个空数组中,最后进行Math.max取最大值
function findLongestWord3(str) {
myStr = str.split(' ');
var arrnum=[];
for(i=0; i<myStr.length;i++){
arrnum.push(myStr[i].length);
}
return Math.max.apply(null,arrnum);
}
var strs = "The quick brown fox jumped over the lazy dog";
findLongestWord3(strs); //6
想法、意识远比技术本身更有传授的价值!
多积累,肯动脑子,肯动手敲代码,多学习,提升自己的能力和对编程思想的理解能力才是最关键!