深入理解Javascript--字符串类型常用算法整理(五)

目录

一、算法在常用场景思考

1.1 算法和前后端的关联思考

1.2 前端所涉及到的算法范围侧重点思考

1.3 编程语言及框架的边界和衍变思考

1.4  足以改变世界的力量

二、字符串类型常见场景及解决算法

2.1 字符串逆序输出

2.1.1 通过数组对象的reverse()方法实现

2.1.3 通过call函数实现

2.1.4 借助栈先进先出的特点实现

2.2.1 通过split()方法

2.2.2 通过lastIndexOf()方法

2.3 字符串去相同字符

2.3.1 暂时想到的最简单思路


一、算法在常用场景思考

1.1 算法和前后端的关联思考

       在学校中接触算法,更加倾向于杭电oj或者蓝桥杯这样的比赛类型的试题。对习题中的编写方式,更多倾向于刷题的感觉,实际作用,无感,或者说没有意识到。在整理了js语言特性中,把语言宏观的分为两部分,一部分是数据容器的构建,另一部分是对数据的操作。操作就包括增删改查和存储,容器就包括了Map,数组,队列,栈,二叉树,堆这些。

       从更大范围来看,并发处理也是对数据操作的一种。数据库也是容器的一种,这样来看的话,后端和前端在语言方面又很大的相似的地方。差异的地方,则是辐射的数据容器不一样,容器的侧重点不一样造成的差异。前端需要考虑数据和视图之间的联动关联,更多的表现在视图和用户交互上面。后端则是考虑数据的增删改查方面。因此在对数据操作效率方面,后端需要的紧密。算法在大的数据中环境下,才会体现出巨大的差异化,所以后端更强调算法。

      但是前端在纯js编写的模板引擎以及数据量较大,需要处理和切割数据的时候,依然需要用到算法相关的内容,处理后端返回的数据,然后再进行数据抽象的过程也耗费了蛮多时间的。

1.2 前端所涉及到的算法范围侧重点思考

       大部分情况下,后端返回给前端的数据中,需要额外处理的数据大部分情况下是字符串、对象数组。因此针对字符串、对象数组的场景进行主要整理和思考。同时使用js模拟一些比较经典的数据容器的方法,也进行整理。

参考书籍:《javascript高级程序设计第四版》--前端红宝书  《常用数据结构和算法图解》

1.3 编程语言及框架的边界和衍变思考

      很莫名的,想到编程语言边界这个词。原因之一是,看了一下go语言的语法,和js大部分基本相同。也是强调的函数式编程,再想到最近较为流行的node.js,三者关联起来。似乎函数式编程和弱语言类型是趋势,而对于高并发的处理则是迈向异步IO或者通过事件轮询的方式模拟异步IO的效果。现阶段运用范围变广的主流语言,都在向这几个特点靠拢。从这个角度来看,大部分语言,首要解决的问题,就是降低编写难度、组件复用化的方式、高并发处理的效果。哪些语言能够更好的解决这些问题,就会得到广大开发者的青睐。

       而后看到司徒正美编写的<<javascript框架设计>>这本书,描述的是javascript历经的框架演变的框架开发者的构思整理。将jquery,React,vue等框架和类库的设计分为了一些核心部分,包括了种子模块、模块加载系统、语言模块、浏览器嗅探和特征监测、类工厂、选择器引擎、节点模块、数据缓存系统、样式模块、属性模块、事件系统、异步处理、数据交互模块、动话引擎、模型层和数据层的关联方式。没有看的很细,但是从这本书的角度,看到了更为宏观的思考方向,那就是框架演变和关注点。

      框架所编写的类库和新得语言方法,并非是相关语言所没有过的方法。而是解决了相关语言所拥有的一些问题,令我吃惊的是,任何一门语言都存在其历史遗留问题。包括荒唐的js,1<2<3输出是true 但是3>2>1输出则是false之类的问题。另一个框架的侧重点则是集中开发者开发过程中常见的问题,然后用封装的方式,统一解决。目的是为了提升使用框架的开发者的开发效率和质量。

1.4  足以改变世界的力量

       正如硅谷之火所描述的年轻人一样。我们今天正处于这样一个时代,充满幻想的人们发现他们获得了他们曾经梦寐以求的力量,并且可以用这个力量来改造我们的世界。在《一往无前》小米成长传记中阐述了小米公司创造之初的并践行到底的理念,避大而全,因此以小命名,用小米加步枪的革命浪漫主义精神来征服世界。事实上小米同样做到了,在国内手机产商中,小米从生态意义上是唯一一家可以和苹果相提并论的公司。从金山和巨无霸微软的碰撞到从硬件+软件+互联网的跨越,一幕幕令人热血沸腾的场景仿若眼前。

       在引人入胜的传奇演绎中,似乎看到了"建立自我到追求无我"的答案中的一种,那就是因为相信所以存在。那种相信的力量,不止是大脑坚信,而是全身上下所以的细胞都相信了我们所描述的未来的蓝图。那么在这股力量下命运的轮盘会靠近我们所相信的东西。找到我们所坚信的蓝图,则是完成了建立自我的第一步。仅仅是一个人的相信,不足以推动命运的轮盘。只有当这股相信的力量能够点燃新的力量,那么这股力量足够强大到征服世界。不过在这个过程中,自身的蓝图已经存在于更大的蓝图中的。

      这种相信若只是一团火焰,可以在黑夜中闪耀,但是仍可能会在风雨中被磨灭。但是若能形成燎原之势,那就会在融入在更加广阔的烈焰中,不分彼此。而照亮这片大地。

二、字符串类型常见场景及解决算法

2.1 字符串逆序输出

  场景分析:给定一个字符串"asmg",输出"gmsa"

常用方式:通过逆序遍历,再存入对应的对象实现。

2.1.1 通过数组对象的reverse()方法实现

   思路整理:通过spilt(")方法将字符串转换为字符串数组,然后使用字符串包装对象自带的方法reverse()将字符串对象逆转,最后使用join()方法,将逆序后的字符串对象转换称字符串;

var test="nihao";var changeTest=test.split('');
var reverseTest=changeTest.reverse();console.log(reverseTest);
function reverseString(str){
    var ChangeToArray=str.split('');
    changeToArray.reverse();
    changeToArray.join('');
}

2.1.3 通过call函数实现

 思路整理:通过Array原型链中的slice()传递字符串的方式,实现类数组的转换。然后调用reverse()方法,实现字符串对象逆转

function reverseString(str){
    var changeString=Array.prototype;
    return changeString.reverse().join('');
}

2.1.4 借助栈先进先出的特点实现

通过数组构建栈的结构实现相应的方式.

    function Stack (){
        //栈中的属性
        this.items = [];
        //栈的相关操作
        //1、将元素压栈
        Stack.prototype.push = function(element) {
            this.items.push(element);
        }
        //2、从栈中去除元素
        Stack.prototype.pop = function() {
            return this.items.pop();
        }
        //3、查看栈顶元素
        Stack.prototype.peek = function() {
            return this.items[this.items.length-1];
        }
        //4、判断栈是否为空
        Stack.prototype.isEmpty = function(){
            return this.items.length === 0;
        }
        //5、获取栈中元素的个数
        Stack.prototype.size = function() {
            return this.items.length;
        }
        //6、toString方法
        Stack.prototype.toString = function() {
            var resultString = "";
            for(var i = 0; i < this.items.length; i++){
                resultString += this.items[i] + ' ';
            }
            return resultString;
        }
        //7、clear方法
        Stack.prototype.clear = function() {
            this.items = [];
        }
    }

//使用自定义栈的数据容器实现倒序输出
function reverseString(str){
    var s=new Stack();
    var arr=str.split('');
    var result='';
    //将元素压进栈内
    for(var i=0;i<arr.length;i++){
    s.push(arr[i]);
    }
    //输出栈内的元素
    for(var j=0;j<arr.length;j++){
    result+=s.pop();
    }
    return result;
}
reverseString("nihoa")

这种方式看上去很复杂,但是栈的结构不止可以用在字符串里面,而且可以对象类型的数据,实现先进先出的储存功能。

2.2 统计字符串中出现最多的字符和次数

2.2.1 通过split()方法

split会将对应的字符串中的字符去除掉。利用这个特点,可以完成对不同字符串的快速计算

function getMaxChar(str){
var finash={//保存最后的结果
"maxCharAmount":0,
"maxChar":null
};
let changeStr=str.split('');
let allLength=changeStr.length;
changeStr.forEach((e,index)=>{
let getlength=str.split(e).length-1;
if(getlength>finash.maxCharAmount){
    finash.maxCharAmount=getlength;
    finash.maxChar=e;
}
})
console.log(finash);
return finash;
}

getMaxChar("ceshiaaa")//a,3

2.2.2 通过lastIndexOf()方法

先对字符串转换成数组,然后进行排序。排序完成后,查找对应字符串中的字符串个数,并保存

function getMaxChar(str){
var finash={//保存最后的结果
"maxCharAmount":0,
"maxChar":null
};
var charSet=str.split('');
charSet.sort();
for(var index in charSet){
    let charAmount;
    charAmount=str.lastIndexOf(charSet[index])-str.indexOf(charSet[index])+1;
    if(charAmount>finash.maxCharAmount){
    finash.maxCharAmount=charAmount;
    finash.maxChar=charSet[index];
}
}
return finash;
}
getMaxChar("ceshiaaa")

2.3 字符串去相同字符

2.3.1 暂时想到的最简单思路

 通过将字符串转换成数组,再将数组存入set去重。后再转换回String

var test="aaabbc";
function filterString(str){
var changeTest=str.split('');
var m=new Set(changeTest);
var finallyData=[...m].join('')
return finallyData;
}
filterString(test)//abc

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值