数组在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;
}
参考