1、在一个数组中找出其中两项相加后的和值为num,如果存在就返回两个数的索引位置,否则返回false
function fn(num,arr){
for(let i = 0;i<arr.length;i++){
let diff = num - arr[i];
let diffIndex = arr.indexOf(diff);
if(diffIndex !== -1){
return [i,diffIndex];
}
}
return false;
}
let num = 3;
let arr = [-1,4,3,2];
console.log(fn(num,arr))//[0,1]
2、二分法返回当前查询值的索引
function fn(arr,val,start = 0,end = arr.length){
if(start > end){
return -1;
}
let middleIndex = Math.floor((start + end) / 2);
let middleValue = arr[middleIndex];
if(middleValue === val){
return middleIndex;
}
if(val > middleValue){
return fn(arr,val,middleIndex + 1,end);
}
if(val < middleValue){
return fn(arr,val,0,middleIndex - 1);
}
return -1;
}
let arr = [1,2,3,4,5,6,7,8];
console.log(fn(arr,7))// 6
3、数组去重
传统写法1
var initArr = [1,2,2,3,4,5,5,7];
var resultArr = [];
function fn(arr){
for(let i = 0;i<arr.length;i++){
if(resultArr.indexOf(arr[i]) === -1){
resultArr.push(arr[i]);
}
}
return resultArr;
}
console.log(fn(initArr));//[1,2,3,4,5,7]
传统写法2
function fn(arr){
return arr.filter((item,index,oriArr) => {
return oriArr.indexOf(item) === index;
})
}
es6写法1
var arr = [1,2,3,4,5,6,5,4,3,2,1];
Array.from(new Set(arr))//[1,2,3,4,5,6]
需要先new一个Set类型的数据,然后将Set类型的数据结构转化成为真正的数组。
es6写法2
var arr = [1,2,3,4,5,6,5,4,3,2,1];
console.log([...new Set(arr)]);//[1,2,3,4,5,6]
和上面一样先new一个Set类型的数据,然后用spread运算符将Set类型的数据结构转化成用逗号分割的参数序列,并放入[]中。
4、js生成斐波那契数组
首先写一个生成斐波那契数列的函数
function getfib(n) {
if(n == 0) return 0;
if(n == 1) return 1;
if(n > 1) return getfib(n - 2) + getfib(n - 1);
}
然后直接利用for循环将值push进数组就可以了
function fibo(len) {
var fibo = [];
for(var i = 0; i < len; i++) {
fibo.push(getfib(i));
}
return fibo;
}
5、js将数组去重,并统计元素重复的次数
var arr = [1,1,2,3,4,5,4,3,5,6];
function fn(arr){
var newArr = [];
newArr = Array.from(new Set(arr));
var newArr2 = new Array(newArr.length);
for(var i = 0;i<newArr2.length;i++){
newArr2[i] = 0;
}
for(var j = 0;j<newArr.length;j++){
for(var k = 0;k<arr.length;k++){
if(newArr[j] === arr[k]){
newArr2[j]++;
}
}
}
for(var n = 0;n<newArr.length;n++){
console.log(newArr[n]+"的重复次数是"+newArr2[n])
}
}
fn(arr);
6、一共有n阶台阶,一个人每次可以选择走一步或两步,一共有多少种方式上到n阶(利用斐波那契数列递归解决)
function fn(n){
if(n === 1){
return 1;
}else if(n === 2){
return 2
}else{
return fn(n - 2) + fn(n - 1);
}
}
console.log(fn(4))//5种方法
7、在一个字符串中找出要查找的字符串出现的次数
let str = 'qwesafaksqwekfhqwhr21412qwesjdfbj2qwewkjefkasqwe';
function getTimes(testStr,searchStr){
return testStr.split(searchStr).length - 1
}
getTimes(str,'qwe');//5次
8、查找最长的单词并输出单词的长度
function getLongestWord(str,splitWay){
let [_splitWay,word,max] = [splitWay || /\s+/g,'',0];
let strArr = str.split(_splitWay);
strArr.forEach((item) => {
if(max < item.length){
max = item.length;
word = item;
}
})
return [word,max];
}
getLongestWord('get the longest word');//['longest',7]
9、打乱数组顺序
function fn(arr){
return arr.sort(() => {
return Math.random() - 0.5;
})
}
//每次选2个数进行运算,进行比较函数的运算,返回用于说明这两个值的相对顺序的数字
//运算过后若为正值才交换位置,否则不换位置
10、数组取最大值,最小值,以及排序
//取最大值
Math.max.apply(null,arr);
//取最小值
Math.min.apply(null,arr);
//Math.max或Math.min后面的参数不支持数组,所以需要用apply的方法将数组[params1,params2,params3]转化为params1,params2,params3
//正序排序
arr.sort((a,b) => { return a - b; });
//倒叙排序
arr.sort((a,b) => { return b - a; });