indexOf原理,Java,javascript,python实现
简介
最近做项目的时候,发现无论是前端还是后端,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
indexOf原理,Java,javascript,python实现的更多相关文章
- Atitit.实现继承的原理and方法java javascript .net c# php ...
Atitit.实现继承的原理and方法java javascript .net c# php ... 1. 实现继承的问题 1 2. 如何拷贝基类方法?采用prototype原型方式,通过冒充对象 1 ...
- 基于类(Java)和基于原理(JavaScript)的对象系统的比较
Java:面向对象编程语言,吸收了C++语言的各种优点,丢掉了C++让人头疼的多继承.指针等概念.具有功能强大和简单易用的两大特征.Java具有简单性.面向对象.分布式.健壮性.安全性.平台独立与可移 ...
- 6月份最新语言排行:Java,Python我更看好谁?
文章首发于终端研发部,转载,请标明原文链接 今天的主题是:探讨一下6月份语言排行还有我的最新展望! 最近,编程语言排行榜前几天发布更新了,在最新的TIOBE编程语言排行榜中,Java依旧位居第一,但前 ...
- 想转行做程序员,是学习JAVA还是Python?哪个更好?
请大家务必审题,转行做程序员,是程序员,并非数据分析也不是软件测试. 首先声明:这是一篇容易引起撕逼的问答,为了祖国和谐,人民安康,请各位看官尽量理性讨论. 同时,这篇文章是面向一些初入行的朋友进行一 ...
- Java集合-Python数据结构比较
Java list与Python list相比较 Java List:有序的,可重复的.(有序指的是集合中对象的顺序与添加顺序相同) Python list(列表)是有序的,可变的. Java Lis ...
- PHP、Java、Python、C、C++ 这几种编程语言都各有什么特点或优点
PHP.Java.Python.C.C++ 这几种编程语言都各有什么特点或优点 汇编: C: Java: C#: PHP: Python: Go: Haskell: Lisp: C++: &l ...
- 关于Visual Studio调试C/C++,JS,PHP,JAVA,Python等语言的方法
我在开始接触vs code后,确实对它的高颜值和小巧灵活而着迷,但是有一个非常现实的问题,相对于vs来说,vscode是一个代码编辑器,而不是一个IDE,在代码编译运行上存在着极大的问题,尤其是开始编 ...
- 一起学Hadoop——使用IDEA编写第一个MapReduce程序(Java和Python)
上一篇我们学习了MapReduce的原理,今天我们使用代码来加深对MapReduce原理的理解. wordcount是Hadoop入门的经典例子,我们也不能免俗,也使用这个例子作为学习Hadoop的第 ...
- c++、Java、python对应的编译型语言和解释性语言区别详解
1.首先明确一点: 高级语言是不能直接在CPU上运行的.CPU只能处理机器语言,就是黑客帝国里面那个10101010101110的数字流. 那么为了让机器语言能够在CPU上运行,那么就必须将其变成机器 ...
- C/C++、Java、Python谁是编译型语言,谁是解释型语言?
最近各大互联网公司线上笔试,编程题目里的编译器只支持C/C++.Java,甚至有的支持javaScrpit和Pascal,就是不支持Python.让一直以来用惯了Python的我直吐血,于是今天痛定思 ...
随机推荐
- “随手记”开发记录day11
今天,我们团队针对每个团队对我们项目的意见或建议进行了探讨,决定了接下来需要改进的地方: (1)背景图片和颜色搭配: (2)增加修改功能: (3)对功能进行更明显划分,让使用者能够更方便的使用.
- “随手记”开发记录day08
今天完成了关于统计页面中的关于每月支出和每月收入的页面
- JavaScript Number() 函数
JavaScript Number() 函数 JavaScript 全局对象 定义和用法 Number() 函数把对象的值转换为数字. 语法 Number(object) 参数 描述 object 必 ...
- C#LeetCode刷题之#283-移动零(Move Zeroes)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3907 访问. 给定一个数组 nums,编写一个函数将所有 0 移 ...
- md文件批量转化为html
任务描述 博客的源文件一般以md文件保存 读取md源文件解析为html代码,然后嵌入到body中去 公式部分,需要使用第三方js库加载 实现办法 基于Django实现,进入webpage页面,然后通过 ...
- 水题大战Vol.3 B. DP搬运工2
水题大战Vol.3 B. DP搬运工2 题目描述 给你\(n,K\),求有多少个\(1\)到\(n\) 的排列,恰好有\(K\)个数\(i\) 满足\(a_{i-1},a_{i+1}\) 都小于\(a ...
- 报错:org.apache.ibatis.type.TypeException: Could not resolve type alias 'com.deppon.gis.module.job.server.server.impl.HaoDuanEntity'.
- run as --> Maven clean 可以清除旧的jar包
run as --> Maven clean 可以清除旧的jar包
- 当Notification和Websocket遇到https、http
@ 目录 一.http转为https请求 (1)生成证书1(crt证书转tomcat使用的jks) (2)配置证书1 (3)生成证书2 (4)配置证书2 二.Websocket改为https连接 后言 ...
- Go 编译器内部知识:向 Go 添加新语句-第 2 部分
这是探讨 Go 编译器两篇文章的最后一篇.在第 1 部分中,我们通过构建自定义的编译器,向 Go 语言添加了一条新语句.为此,我们按照此图介绍了编译器的前五个阶段: 在"rewrite AS ...