JS数组和常见算法题题解

数组在push元素有很好的性能,但是在数组中间插入,删除和查找元素上性能却不是很优,JavaScript中的数组的大小是可以动态增长的;

数组的各种操作复杂度

  • Push: O(1)
  • Insert: O(n) 在数组最前面插入,后面n个都得后移
  • Delet: O(n) 在数组最前面删除,后面n个都得前移
  • Searching: O(n) 查找一个指定的数据则是O(N),这个数据可能在最末尾

数组中访问第n个数据的时间花费是O(1),给出下标的情况

  • Optimized Searching: O(log n)

常见算法题:

  • 字符串反转,借用数组自带方法reverse(str.reverse is not a function),所以先转化为数组split(''),然后reverse,最后join('')

数组reduce方法,迭代数组所有项,可以在回调函数中进行操作

function strReverse(str) {
	return str.split('').reverse().join('');
}
function strReverse(str) {//不用revers如何实现?
	var res='';
	return str.split('').reduce(function (res,char) {
		return char+res; //char为当前字符,加在res前面,可以实现反转
	});//res保留每一次迭代之后的当前字符串
}
  • 回文字符串(可以将字符串反转看看和原字符串是否相同)

0与len-1,1与len-2...均相同的字符串称为回文字符串

function isPali(str) {
	if(str===strReverse(str))//上面的函数
		return true;
	else
		return false;
}
  • 整数反转,整数使用toString方法转为字符串,字符串反转步骤,parseInt转number类型,Math.sign获得数字的正负
function numberReverse(num) {
	return parseInt(num.toString().split('').reverse().join(''))*Math.sign(num);
}
  • 字符串出现次数最多的字符

可以创建一个对象obj,遍历字符串,字符串的每个字符作为对象的key,value是对应该字符出现的次数。遍历这个对象,找出value最大的key。

function strMany(str) {
	var obj={};
	for (let i = 0; i < str.length; i++) {
		var char=str.charAt(i)
		if(char in obj){
			obj[char]++;
		}else{
			obj[char]=1;
		}
	}
	console.log(obj)
	var max=0;
	var maxchar=[];
	for(let i in obj){
		if(obj[i]>max){
			max=obj[i];//得到最大次数,该最大次数的字符可能有多个
		}
	}
	for(let i in obj){
		if(obj[i]===max){
			maxchar.push(i);//得到最大次数
		}
	}
	return maxchar;
}
  • 找出字符串中元音字母(特定字符)出现的个数
function strSpecial1(str) {
	var count=0;
	for (let i = 0; i < str.length; i++) {遍历字符串中的每个字符,判断每个字符是否为aeiou中的一个
		if('aeiou'.indexOf(str.charAt(i))>-1){
			count++;
		}
	}
	return count;
}
正则表达式
function strSpecial(str) {
	var match=str.match(/[aeiou]/gi);//检查字符串中的所有aeiou,放到数组match中
	return match.length;//match中保存str中出现过的所有元音字母
}
  • 数组分隔给定数组和大小,将数组项拆分为具有给定大小的数组列表

使用while循环,每次再循环能slice一个固定大小的数组保存,更新当前index

function arrSplit(arr,size) {
	var chunks=[];
	var index=0;//开始切割的下标
	while(index<arr.length){
		chunks.push(arr.slice(index,index+size));
		//取index到index+size-1的所有数
		index=index+size;
	}
	return chunks;
}
  • 给定一个短语,按照顺序反转每一个单词,相当于对每个单词执行反转,再合并

利用单词间的间隔split(' ')将句子分成每个单词的数组,通过map方法修改每个单词,合并成新的数组,再用空格合并join(' ')可以恢复成句子的样子

function wordsReverse(str) {
	var newstr=str.split(' ').map(function(item){
		return item.split('').reverse().join('');
	}).join(' ');
	return newstr;
}
  • 短语首字母大写
function firstUpper(str) { return str.charAt(0).toUpperCase()+str.slice(1); }
  • 凯撒密码:将输入的字符与字母表的字母同时移位映射好

字符串中取某个下标的字符,使用charAt(i)和[i]均可

function casser(str,num) {
	var code='abcdefghijklmnopqrstuvwxyz';
	var strlower=str.toLowerCase();
	var num=num%26;
	var res='';
	for (let i = 0; i < strlower.length; i++) {
		var char=strlower[i];
		if(!code.includes(char)){//es6新方法,用于判断数组中是否有某字符
			res+=char;
		}else{
			index=code.indexOf(char)+num;
			if(index>25){
				index-=26;
			}
			if(index<0){
				index+=26;
			}
			res+= str[i]===str[i].toUpperCase()?code[index].toUpperCase():code[index]
		}
	}
	return res;
}
  • 一定范围内的所有质数 2是质数,1不是

首先写一个函数判断某个数是不是质数(从2-根号n),用for循环遍历这个范围对每个数进行判断

function isPrime(num) {
	if(num===2){
		return true
	}
	//因子成对出现,只需要对比到根号n
	for (var i = 2; i < Math.sqrt(num); i++) {
		if (num%i===0) {//2~根号n有整除的情况,就不是质数
			return false;
		}
	}
	return true;
}
function getPrime(a,b) {
	var res=[];
	for (let i = a; i <= b; i++) {
		if(isPrime(i)){
			res.push(i);
		}
	}
	return res;
}

参考

https://juejin.im/post/5ca2cbdaf265da30ca24a2b4?utm_medium=hao.caibaojian.com&utm_source=hao.caibaojian.com

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值