java LeetCode普通字符串模拟题解示例

Java LeetCode普通字符串模拟题解示例攻略

1. 题目简述

本题是一道字符串模拟题目,要求实现一个String模拟类,具有以下功能:

  • 初始化操作:构造函数接受一个字符串作为参数,将其存储在对象中。
  • 获取字符串操作:实现一个charAt方法,接受一个整数索引index,返回字符串指定位置的字符;实现一个substring方法,接受两个整数索引startIndexendIndex,返回字符串指定区间的子串。
  • 查找操作:实现一个indexOf方法,接受一个字符串pattern,返回字符串中第一次出现该模式的下标;实现一个lastIndexOf方法,接受一个字符串pattern,返回字符串中最后一次出现该模式的下标。

2. 解题思路

本题的关键在于实现charAt方法和substring方法,以及indexOf方法和lastIndexOf方法。

2.1 charAt方法和substring方法

这两个方法都比较简单,直接按下标遍历字符串即可。实现代码如下所示:

public char charAt(int index) {
    if (index < 0 || index >= str.length()) {
        throw new IndexOutOfBoundsException();
    }
    return str.charAt(index);
}

public String substring(int startIndex, int endIndex) {
    if (startIndex < 0 || endIndex > str.length() || startIndex > endIndex) {
        throw new IndexOutOfBoundsException();
    }
    return str.substring(startIndex, endIndex);
}

2.2 indexOf方法和lastIndexOf方法

这两个方法涉及到字符串的匹配问题,可以使用KMP算法或者暴力匹配算法来实现。这里我们采用暴力匹配算法,实现代码如下所示:

public int indexOf(String pattern) {
    if (pattern == null || pattern.length() == 0) {
        return 0;
    }
    for (int i = 0; i < str.length(); i++) {
        int j = 0;
        for (; j < pattern.length() && i + j < str.length(); j++) {
            if (pattern.charAt(j) != str.charAt(i + j)) {
                break;
            }
        }
        if (j == pattern.length()) {
            return i;
        }
    }
    return -1;
}

public int lastIndexOf(String pattern) {
    if (pattern == null || pattern.length() == 0) {
        return str.length();
    }
    for (int i = str.length() - pattern.length(); i >= 0; i--) {
        int j = 0;
        for (; j < pattern.length(); j++) {
            if (pattern.charAt(j) != str.charAt(i + j)) {
                break;
            }
        }
        if (j == pattern.length()) {
            return i;
        }
    }
    return -1;
}

3. 示例说明

3.1 示例一

假设我们有一个字符串str = "Hello World!",现在要对其进行操作,代码如下所示:

MyString myString = new MyString(str);
char c = myString.charAt(0);
String subString = myString.substring(6, 11);
int index = myString.indexOf("World");
int lastIndex = myString.lastIndexOf("l");

System.out.println(c); //输出 'H'
System.out.println(subString); //输出 "World"
System.out.println(index); //输出 6
System.out.println(lastIndex); //输出 9

观察输出结果,对应的字符、子串、索引都符合预期,说明代码实现正确。

3.2 示例二

现在我们来测试一个空字符串的操作,代码如下所示:

MyString myString = new MyString("");
char c = myString.charAt(0);
String subString = myString.substring(0, 5);
int index = myString.indexOf("Hello");
int lastIndex = myString.lastIndexOf("World");

System.out.println(c); //抛出 IndexOutOfBoundsException 异常
System.out.println(subString); //抛出 IndexOutOfBoundsException 异常
System.out.println(index); //输出 -1
System.out.println(lastIndex); //输出 -1

可以看到,对空字符串进行操作时,charAtsubstring方法会抛出IndexOutOfBoundsException异常,而索引查找时返回-1。这也符合我们的预期,说明代码正确。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java LeetCode普通字符串模拟题解示例 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java中Servlet处理乱码的方法

    以下是“java中Servlet处理乱码的方法”的完整攻略: 1. 了解编码问题 在 Java 中,字符串都是以 Unicode 编码存储的。而在网络传输过程中,需要将字符串编码成字节流传输。常用的编码方式有 UTF-8 和 ISO-8859-1 等。而在解码端,也需要使用相应的编码方式来将字节流解码成字符串。如果编解码方式不一致,就会出现乱码问题。 2. …

    Java 2023年5月20日
    00
  • Java获取凌晨时间戳的方法分析

    以下是“Java获取凌晨时间戳的方法分析”的完整攻略。 标题 Java获取凌晨时间戳的方法分析 简介 在某些业务场景下,需要获取凌晨的时间戳,比如签到功能,需要判断用户是否在当天的凌晨进行签到。本文从获取当天零点时间戳的角度来进行分析,并提供实例。 步骤 1.使用Calendar类 最简单的方法是使用Calendar类,获取当前时间并将其设置为零点。代码如下…

    Java 2023年5月20日
    00
  • 获取Java的MyBatis框架项目中的SqlSession的方法

    获取Java的MyBatis框架项目中的SqlSession对象的方法,可以从以下几个方面进行介绍。 方法一:通过MyBatis提供的SqlSessionFactory创建SqlSession对象 首先,在Java的MyBatis框架项目中,需要首先通过MyBatis提供的SqlSessionFactory创建SqlSession对象。可以通过以下步骤实现:…

    Java 2023年5月20日
    00
  • Java CAS机制详解

    Java CAS机制详解 什么是CAS机制 CAS(Compare And Swap),即比较并替换,是一种并发控制方式。它的思想是:当多个线程尝试同时更新某一个内存地址时,只有其中一个线程能更新成功,而其余的线程都需要等待。这种方式在并发编程中是很常见的。 CAS机制是通过硬件保证操作的原子性,来避免线程安全问题。 CAS操作的原理 CAS机制需要涉及到三…

    Java 2023年5月26日
    00
  • JSP 中Servlet的自己实现

    JSP 中Servlet的自己实现 Servlet是Java中常用的服务器端程序,可以接收和处理HTTP请求,并返回相应的 HTTP响应。JSP(Java Server Pages) 是一个动态的Java web页面技术,可以在网页中嵌入 Java 代码片段,用于生成动态内容。 在JSP中使用Servlet,通常有两种方式:一是在JSP页面中直接使用标签引入…

    Java 2023年6月15日
    00
  • 这可能是最全面的MySQL面试八股文了

    什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据。你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列)。行代表每一行数据,列代表该行中的每个值。列上的值是有数据类型的,比如:整数、字符串、日期等等。 数据库的三大范式 第一范式1NF 确保数据库表字段的原子性。最全面的Java面试网站 比如字段 userInfo:…

    Java 2023年4月25日
    00
  • 详细理解JAVA面向对象的封装,继承,多态,抽象

    JAVA面向对象的基本概念 在Java中,“一切皆对象”,Java程序就是通过面向对象的编程思想来实现的。面向对象的编程思想的核心概念主要包括封装、继承、多态和抽象。这些概念描述了Java对象与类之间的关系和相互作用。 封装 封装是指将数据和行为包装在一起,形成一个类。封装的主要目的是隐藏类的实现细节,只对外部暴露必要的接口,从而达到数据的安全性。 在Jav…

    Java 2023年5月26日
    00
  • SpringBoot整合Quartz及异步调用的案例

    以下是关于“SpringBoot整合Quartz及异步调用的案例”的完整攻略: 一、Quartz简介 Quartz 是一个开源的作业调度框架,它可以用来调度执行像邮件发送,定时任务,数据备份等任务。在项目中使用 Quartz,可以非常方便地实现任务的调度和管理。 二、SpringBoot整合Quartz步骤 1. 添加依赖 在 pom.xml 中添加 Qua…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部