前端算法总结(字符串反转、回文串检测、数组去重、统计字符串中出现次数最多的字符以及括号匹配)

最近在网上看到了一些算法相关的知识,总结一下。

1、字符串反转算法

思路:先用split() 方法把字符串分割成字符串数组,再利用reverse() 方法颠倒数组中元素的顺序,最后用join() 方法把数组中的所有元素放入一个字符串。

//字符串反转
var oldStr = "abcdefg";
var newStr = reverseStr(oldStr);
document.write("oldStr="+oldStr+"<br>   newStr="+newStr);

function reverseStr(str){
	return str.split("").reverse().join("");
}

执行结果如下:
在这里插入图片描述

2、回文字符串检测算法

回文字符串:是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。
思路:先用split() 方法把字符串分割成字符串数组,然后利用reverse() 方法颠倒数组中元素的顺序,再用join() 方法把数组中的所有元素放入一个字符串,最后判断倒置之后的字符串是否和原字符串相等,相等则返回true,表示该字符串是回文串,否则不是。

//回文字符串检测
var oldStr = "abccba";
var newStr = reverseStr(oldStr);
document.write("oldStr="+oldStr+"<br>   newStr="+newStr);

function reverseStr(str){
	return str==str.split("").reverse().join("");
}

执行结果如下:
在这里插入图片描述

3、数组元素去重算法

(1)indexOf()实现去重(不改变原数组)

思路:将数组中不重复的元素依次放进另一个临时数组中,并返回该临时数组。

//数组去重算法(一):indexOf()去重
var oldArr = ["a","b","c","a","c"];
var newArr = deleteRepeatElement(oldArr);
document.write("oldArr="+oldArr+"<br>   newArr="+newArr);

function deleteRepeatElement(arr){
	let tmpArr = [];
	for(let i = 0; i < arr.length; i++){
    	if(tmpArr.indexOf(arr[i]) == -1){
        	tmpArr.push(arr[i]);
        }
    }
	return tmpArr;
}

执行结果如下:
在这里插入图片描述

(2)filter()过滤实现去重(不改变原数组)

思路:deleteRepeatElement(ele,index,arr)方法中ele为数组中的元素,index为当前数组元素ele在数组中的索引下标,arr为当前数组,该方法用于判断当前元素在数组中第一次出现的位置是否与ele元素索引相同。filter()方法对数组的每一个元素依次执行deleteRepeatElement()方法,其默认为deleteRepeatElement()方法传递三个参数,分别为ele,index,arr,当deleteRepeatElement()返回true时用当前的数组元素组成一个新的数组,不改变原数组的值。

//数组去重算法(二):filter()去重
var oldArr = ["a","b","c","a","c","l"];
var newArr = oldArr.filter(deleteRepeatElement);
document.write("oldArr="+oldArr+"<br>   newArr="+newArr);

function deleteRepeatElement(ele,index,arr){
	return arr.indexOf(ele)==index;
}

执行结果如下:
在这里插入图片描述

(3)双重for循环+splice()实现去重(会改变原数组)

思路:利用双层for循环对于数组的每一个元素是否有相同的元素逐一对比,若存在重复元素则删除重复元素,最后留下的元素组成的数组即为去重后的结果。

//数组去重算法(二):双重for循环+splice()去重
var oldArr = ["a","b","c","a","c","l"];
var newArr = deleteRepeatElement(oldArr);
document.write("oldArr="+oldArr+"<br>   newArr="+newArr);

function deleteRepeatElement(arr){
	let len = arr.length;
	for(let i = 0; i < len - 1; i++){
    	for(let j = i + 1; j < len; j++){
        	if(arr[i] == arr[j]){
            	document.write("i="+i+"    j="+j+"    arr[i]=arr[j]="+arr[i]+"<br>");
            	arr.splice(j,1);
                len--;//删除原数组元素之后数组长度减小,故需要减1
                j--;//删除数组元素之后,当期j会相对原素组索引位置增加,因此需要减1
            }
        }
    }
	return arr;
}

执行结果如下:
在这里插入图片描述

4、统计字符串中出现最多的字符以及字符出现最多的次数

思路:分别对输入字符串的每个字符作为对象的key,并对其出现的次数进行统计,最后按照传参的情况返回对应的结果(若字符串中出现次数最多的字符有多个,则只能统计到最后一个出现最多次数的字符)。

//统计一个字符串中出现最多的字符出现的次数或者出现次数最多的字符
<script>
var maxCharNum = charMaxSum("abcdefff");
var maxNumChar = charMaxSum("abcdefff",1);
document.write("<br>多字符执行结果:multiStr=abcdefff----maxCharNum="+maxCharNum+"----maxNumChar="+maxNumChar+"<br>");
var singleStrNum = charMaxSum("a");
var singleStrChar = charMaxSum("a",1);
document.write("<br>单字符执行结果:singleStr=a----singleStrNum="+singleStrNum+"----singleStrChar="+singleStrChar+"<br>");

function charMaxSum(str,isMaxNum){//isMaxNum=0:返回出现最多的字符出现的次数,否则返回出现次数最多的字符
	document.write("<br><br><br>-----开始执行函数,这里是分割线----str="+str+"----isMaxNum="+isMaxNum+"<br>");
	let len = str.length;
    let maxNum = 1;
    let maxNumChar = "";
	let charSumObj = {};//存放字符串中出现的字符以及对应出现的次数
	for(let i = 0; i < len; i++){
		if(!charSumObj[str[i]]){
			charSumObj[str[i]] = 1;
		}else{
			charSumObj[str[i]] += 1;
		}
	}
	for(var key in charSumObj){
		if(charSumObj[key] >= maxNum){
			maxNum = charSumObj[key];
			maxNumChar = key;
		}
	}
	document.write("<br>-----函数执行结束,这里是分割线----maxNumChar="+maxNumChar+"----maxNum="+maxNum+"<br>");
	return isMaxNum&&isMaxNum!=0?maxNumChar:maxNum;
}
</script>

执行结果如下:
在这里插入图片描述

5、括号匹配算法

思路:先将输入字符串中的要匹配的括号按顺序提取出来放进数组中,数组长度为0则不存在待匹配的括号;长度为奇数时则括号匹配一定不成功;只有长度为偶数时,进行如下检测:循环对数组进行检测,当检测到右括号时,与数组前一个元素进行匹配,匹配成功则删除匹配成功的一对括号。重复该检测过程直到循环结束,若数组长度为0则匹配成功(因为匹配成功后会删除匹配成功的成对括号),否则匹配不成功。(可将需要检测的成对括号按照规则添加进signalModelJson中)。

//判断字符串中括号的匹配情况
<script>
    var signalModelJson = {
    	")":"(",
        "]":"[",
        "}":"{"
    }
    matchSignal("123");
    matchSignal("123{}{}{([)([]])");
    matchSignal("123{}{}{([)([]]");
    matchSignal("123{}{}{}({[][]})");
    
    function matchSignal(str){
    	document.write("<br><br><br>----开始符号匹配函数:这里是分界线----str+"+str+"<br>");
        let strLen = str.length;//输入的要匹配检测的原始字符串的长度
        let signalArr = [];//用于按顺序存放待检测字符串中要匹配的符号
        for(let i = 0; i < strLen; i++){
        	for(var key in signalModelJson){
            	if(str[i]==key || str[i]==signalModelJson[key]){//
                	signalArr.push(str[i]);
                }
            }
        }
        let arrLen = signalArr.length;
        if(arrLen == 0){
        	document.write("<br>----符号匹配函数结束:这里是分界线----结果:字符串中暂无待匹配的括号!<br>");
        	return false;
        }else if(arrLen % 2 != 0){//符号长度为奇数,则肯定不匹配,即返回false
        	document.write("<br>----符号匹配函数结束:这里是分界线----结果:括号个数为奇数,括号不匹配!<br>");
        	return false;
        }else{
        	for(let i = 0; i < arrLen; i++){
        		if(signalModelJson[signalArr[i]]){//如果是右括号,则与其前一个进行比较
            		if(i>0 && signalModelJson[signalArr[i]]==signalArr[i-1]){//右括号与其前一个括号匹配成功,则将匹配成功的两个符号移除
                    	signalArr.splice(i-1,2);//移除匹配成功的两个符号
                        arrLen = signalArr.length;
                        i = i-2>=0?i-2:0;//移除两个符号之后,重新赋值
                    }
            	}
        	}
    		document.write("<br>----符号匹配函数结束:这里是分界线----结果:"+(signalArr.length==0?"恭喜你语法正确,括号匹配成功!":"括号不匹配,请重新检查语法!")+"<br>");
            return signalArr.length==0?true:false;
        }
    }
</script>

执行结果如下:
在这里插入图片描述
持续更新,未完待续……

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值