算法小题

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; });

猜你喜欢

转载自blog.csdn.net/mofigg/article/details/81058506