简介
最近做项目的时候,发现无论是前端还是后端,indexOf出现的概率都非常频繁,今天我们来看下他的实现原理吧!
indexOf的含义:给定一个字符串去匹配另一个字符串的下标,如果匹配到,返回下标,如果匹配不到则返回-1,其实原理还是比较简单的,如果需要你实现,那么应该怎么做呢?
原理
现在给定匹配的字符串A,原始字符串B,比如匹配字符串A等于“叫练”,原始字符串B等于“边叫边练,我喜欢叫练”,你可能一眼就发现“叫练”是最后两个字符,我们以B做循环,一个一个单词去匹配,先找“叫”,找到计数器加1,然后继续找“练”,发现下个字符不是“练”,计数器清零,重新从“叫”开始查找,现在查找到B的倒数第二个字符了,下个字符是“练”计算器再加1,此时计数器等于2也正好是A字符串的长度,说明找到了,查找原理就是这样一个过程;下面我们分别以Java,javascript,python方式实现下。
注意:下面代码没有校验,仅供参考,python是index方法,实现原理一样,但找不到会报错!
实现
Java实现
public static void main(String[] args) { String orgin = "边叫边练,我喜欢叫练"; String serach = "叫练"; int index = indexOf(orgin,serach); System.out.println(index); } /** * indexOf 算法原理 * @param orgin 原始字符串 B = “边叫边练,我喜欢叫练”; * @param serachString 匹配字符串 A=“叫练” * @return int 下标 */ public static int indexOf(String orgin,String serachString) { char[] chars = orgin.toCharArray(); char[] sChars = serachString.toCharArray(); //返回字符串下标 int index = -1; //匹配字符串计数器,用于查询是否匹配到完整字符串 int s_index = 0; //全局计数器,用于计算下标 int move = 0; for (int i=0; i<chars.length; i++) { move++; //如果匹配到“叫”,继续向下开始匹配“练” if (chars[i] == sChars[s_index]) { s_index++; if(s_index == sChars.length) { index = move-sChars.length; break; } } else { s_index = 0; } } return index; }
Javascript实现
/** * @param orgin 原始字符串 B = “边叫边练,我喜欢叫练”; * @param serachString 匹配字符串 A=“叫练” **/ function indexOf(orgin,serachString) { //返回字符串下标 var index = -1; //匹配字符串计数器,用于查询是否匹配到完整字符串 var s_index = 0; //全局计数器,用于计算下标 var move = 0; for (var i=0; i<orgin.length; i++) { move++; //如果匹配到“叫”,继续向下开始匹配“练” if (orgin.substr(i,1) == serachString.substr(s_index,1)) { s_index++; if(s_index == serachString.length) { index = move-serachString.length; break; } } else { s_index = 0; } } return index; }
python实现
# indexOf 算法原理 # @param orgin 原始字符串 B = “边叫边练,我喜欢叫练”; # @param serachString 匹配字符串 A=“叫练” # @return int 下标 def index(orgin, serachString): # 返回字符串下标 index = -1 # 匹配字符串计数器,用于查询是否匹配到完整字符串 s_index = 0 # 全局计数器,用于计算下标 move = 0 for letter in enumerate(orgin): move = move + 1 # 如果匹配到“叫”,继续向下开始匹配“练” if letter[1] == serachString[s_index]: s_index = s_index + 1 if s_index == len(serachString): index = move - len(serachString) break else: s_index = 0; return index
以上就是python,Java,JavaScript实现indexOf的详细内容,更多关于indexOf的资料请关注其它相关文章!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】