二分 第一次出现的位置,最后一次出现的位置

本文介绍了一种使用C++实现的二分查找算法,包括寻找目标值首次出现、最后一次出现及普通查找的方法,并通过实例展示了如何运用这些算法。
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;

class mysolve
{
public:

    int a[20];
    int binary_first(int a[],int len,int key)//第一次出现的位置
    {
        int left=0;
        int right=len-1;
        while(left<right)
        {
            int mid=(left+right)/2;
            if(a[mid]<key)
                left=mid+1;
            else
                right=mid;


        }
        if(a[left]==key)
            return left;
        return -1;
    }

    int binary_second(int a[],int len,int key)//最后一次出现的位置
    {
        int left=0;
        int right=len-1;
        while(left<right-1)
        {
            int mid=(left+right)/2;
            if(a[mid]>key)
               right=mid-1;
            else  left=mid;

        }
        if(a[right]==key)
            return right;
        else if(a[left]==key)
            return left;
        else return -1;
    }
    int putong(int a[],int len,int key)
    {
        int left=0;
        int right=len-1;
        while(left<=right)
        {
            int mid=(left+right)/2;
            if(a[mid]<key)
                left=mid+1;
            else if(a[mid]==key)
                return mid;

            else
                right=mid-1;
        }
        return -1;
    }


};



int main()
{
    mysolve solve;

    int z[20]= {1,2,2,2,2,2,2,2,2,2,3};
    memcpy(solve.a,z,sizeof(int)*20);
    cout<<solve.binary_first(solve.a,11,2)<<endl;
    cout<<solve.binary_second(solve.a,11,2)<<endl;
    cout<<solve.putong(solve.a,11,2);

}

<think>好的,用户的问题是如何获取子字符串在母字符串中第一次出现的索引位置。首先,我需要确定用户使用的编程语言,因为不同语言的方法可能不同。用户提供的引用中有JavaScript、Python和Java的例子,所以可能需要覆盖这三种语言的方法。 首先,针对JavaScript,用户提到了indexOf()方法,引用[1]中的例子显示使用str.indexOf('str')返回索引11。所以应该先解释JavaScript的实现方式,说明indexOf()的用法和返回值。 然后是Python,引用[2]中提到了str.find()方法,返回子字符串的最低索引,如果找不到返回-1。需要说明find()的参数,比如start和end是可选的,以及如何处理找不到的情况。 接下来是Java,引用[3]和[4]都涉及Java中的处理方式。Java中可以用String类的indexOf()方法,或者使用正则表达式和Matcher类。用户提供的代码示例中有使用Matcher和Pattern的,但可能更简单的方法是直接使用indexOf(),这样代码更简洁。需要对比这两种方法,指出哪种更常用和简便。 还需要注意用户的问题中是否要求处理大小写敏感的情况,但用户没有提到,所以可能默认是区分大小写的。此外,是否需要处理多次出现的情况,但用户明确问的是第一次出现的位置,所以重点放在首次出现的获取上。 然后,根据用户提供的引用,需要确保回答中正确引用对应的示例,比如JavaScript用indexOf,Python用find,Java用indexOf或者Matcher。同时,用户可能需要代码示例,所以每个语言部分都要给出简单的代码片段,如: JavaScript:let index = str2.indexOf(str1); Python:index = str2.find(str1) Java:int index = str2.indexOf(str1); 此外,要提到返回值,如果找不到返回-1(在JavaScript和Java中)或者-1(Python),所以用户在使用时需要检查返回值是否为-1来处理不存在的情况。 最后,确保回答结构清晰,分语言说明,代码示例正确,并且引用对应的引用来源。可能还需要生成相关问题,比如如何处理多次出现的索引,或者不区分大小写的查找,以及不同语言中的其他方法等。</think>根据编程语言不同,获取子字符串首次出现索引的常用方法如下: ### 一、JavaScript实现 使用字符串的$indexOf()$方法,返回值为首次出现的索引(从0开始),未找到返回-1 ```javascript let mainStr = "Hello world"; let subStr = "world"; let index = mainStr.indexOf(subStr); // 返回6[^1] ``` ### 二、Python实现 通过字符串对象的$find()$方法,语法为$str.find(sub[, start[, end]])$ ```python main_str = "Hello world" sub_str = "world" index = main_str.find(sub_str) # 返回6[^2] ``` ### 三、Java实现 1. **String类方法**:直接使用$indexOf()$ ```java String mainStr = "Hello world"; String subStr = "world"; int index = mainStr.indexOf(subStr); // 返回6[^4] ``` 2. **正则表达式**(适用于复杂匹配): ```java Matcher matcher = Pattern.compile(Pattern.quote(subStr)).matcher(mainStr); if(matcher.find()) { int index = matcher.start(); // 返回匹配起始索引[^3] } ``` ### 四、注意要点 1. 所有方法均区分大小写 2. 子字符串不存在时: - JavaScript/Python返回-1 - Java返回-1(String类方法) 3. 特殊字符需转义处理(如正则表达式场景)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值