力扣字符串刷题-六道题记录-1

目录

一、找出字符串中的第一个匹配项的下标

问题

两个字符串haystack字符串和needle字符串,在haystack字符串中找出needle字符串的第一个匹配的下标(下标从0开始)。如果needle字符串不是haystack字符串的一部分,返回-1
示例:

输入:haystack = "sadbutsad",needle = "sad"

输出:0

代码

方法一:直接使用函数

查看haystack字符串是否含有needle字符串

java 复制代码
class Solution {
    public int strStr(String haystack, String needle) {
        return haystack.indexOf(needle);
    }
}

方法二:暴力匹配

  1. 获取两个字符串的长度:h=haystack,n=needle;
  2. 外层循环:遍历主字符串中所有可能起始的位置;条件i+n<h,确保子字符串不会超出主字符串的边界;
  3. 设置标志位,初始假设当前位置匹配成功
  4. 内层循环:比较字符串的每个字符
  5. 逐个字符比较:主字符串从位置i+j开始的字符与子字符串位置j的位置
  6. 发现不匹配,标志位为false,跳出循环
  7. 检查内层循环结束后标志位的状态
  8. 遍历完所有可能位置都未找到匹配,返回-1
java 复制代码
class Solution {
    public int strStr(String haystack, String needle) {
        int h = haystack.length();
        int n = needle.length();
        for(int i=0;i+n<=h;i++){
            boolean flag = true;
            for(int j=0;j<n;j++){
                if(haystack.charAt(i+j)!=needle.charAt(j)){
                    flag = false;
                    break;
                }
            }
            if(flag){
                return i;
            }
        }
        return -1;
    }
}

涉及到的函数方法

1. indexOf():

查找子字符串在目标字符串中第一次出现的位置,从前往后找

  1. 参数:
  • 可带要查找的字符:indexOf('e') 查找e字符
  • 可带要查找的子字符串:indexOf('needle') 查找是否含有子字符串
  • 可带开始搜索的起始位置:indexOf('needle',2) 从下标2的位置开始查找是否含有子字符串
  1. 返回值:
  • 找到时:返回字符串第一次出现的起始索引;
  • 未找到时:返回-1
  1. 应用场景:
  • 检查目标字符串是否包含子字符串
  • 提取子字符串
  • 统计字符出现次数
  • 验证文件类型
  1. 扩展:
方法 功能 区别
indexOf() 查找第一次出现的位置 从前往后找
lastIndexOf() 查找最后一次出现的位置 从后往前找
contains() 检查是否包含子串 返回Boolean,内部调用indexOf()
startWith() 检查是否以某字符串开头 只检查开头
endWith() 检查是否以某字符串结尾 只检查结尾

2. length()

返回字符串中包含字符的数量。

  1. 返回类型:int 字符串的长度
  2. 注意:字符串是length(),数组是length,数组中没有括号。
  3. 当为空字符串时,返回0;当字符串为null时,抛出异常;当字符串为特殊字符时,返回占用的字节

3. charAt()

用于返回字符串中指定索引位置的字符

  1. 定义:
java 复制代码
public char chartAt(Int index)
  1. 参数说明:index 指要获取的字符的索引位置(从0开始)
  2. 返回值:返回指定索引位置的char类型字符
  3. 与数组访问的区别
java 复制代码
String str = "Hello";
char[] arr = {'H','e','l','l','o'};

// 两种访问方式
char c1 = str.charAt(2);    // 字符串方式
char c2 = arr[2];           // 数组方式
  1. 应用场景:
  • 遍历字符串
  • 统计字符出现次数
  • 字符串反转

二、最后一个单词的长度

问题

一个字符串s,由若干个单词组成,单词前后用一些空格字符串隔开。返回字符串中最后一个单词的长度。
示例:

输入:s = "Hello World"

输出:5

代码

反向遍历:

  1. 从字符串末尾开始查找,初始化索引为字符串最后一个字符的位置
  2. 跳过末尾的索引空格:当当前字符串是空格时,索引向前移动
  3. 初始换单词长度计数器
  4. 计算最后一个单词的长度:当索引>=0且当前字符不是空格时
  5. 增加单词长度计数
  6. 索引继续向前检查
  7. 返回最后一个单词的长度
java 复制代码
class Solution {
    public int lengthOfLastWord(String s) {
        int index = s.length()-1;
        while(s.charAt(index)==' '){
            index--;
        }
        int wordLength = 0;
        while(index>=0 && s.charAt(index)!= ' '){
            wordLength++;
            index--;
        }
        return wordLength;
    }
}

涉及到的函数方法

  1. length():返回字符串中包含字符的数量。
  2. charAt():用于返回字符串中指定索引位置的字符

三、二进制求和

问题

两个二进制字符串ab,以二进制字符串的形式返回它们的和。
示例:

输入:a = "1010" b = "1011"

输出:"10101"

代码

  1. 获取两个字符串的长度,从字符串末尾开始查找,初始化索引为字符串最后一个字符的位置
  2. 设置进位标志,初始索引为0(二进制进位只能是0或1)
  3. 使用StringBuilder 构建字符串
  4. 循环条件:任意字符串还有数组未处理 或 还有进位需要处理
  5. 当前位的总和初始化位进位值
  6. 如果字符串a还有数组未处理,加上该位的值
  7. char转int并移动指针
  8. 如果字符串b还有数组未处理,加上该位的值
  9. char转int并移动指针
  10. 计算当前位的结果:sum % 2(取余),然后转回char类型,插入到结果最前面
  11. 计算新的进位:sum / 2(二进制中除以2取整)
  12. 返回最终结果字符串
java 复制代码
class Solution {
    public String addBinary(String a, String b) {
        int i = a.length() - 1;
        int j = b.length() - 1;
        int cin=0;//进位
        StringBuilder result = new StringBuilder();
        while(i>=0||j>=0||cin>0){
            int sum=cin;
            if(i>=0)sum+=a.charAt(i--)-'0';
            if(j>=0)sum+=b.charAt(j--)-'0';
            result.insert(0, (char)(sum % 2 + '0'));
            cin=sum/2;
        }
        return result.toString();
    }
}

涉及到的函数方法

1. StringBuilder

可变字符串

可查看Java基础学习(二):Java中的变量和常量、final(重点)、运算、字符串这篇文章中的字符串内容。

2. insert()

insert() 是 StringBuilder 和 StringBuffer 类中非常重要的一个方法。

用于在字符串构建器的指定位置插入数据

  1. 方法定义
java 复制代码
StringBuilder insert(int offset, 数据类型 value)
  1. 参数说明:
  • offset:插入位置的索引
  • value:要插入的值
  1. 返回值:返回 StringBuilder 对象本身
  2. 应用场景:
  • 在特定位置插入字符
  • 格式化字符串
  • 插入多个数据类型
  • 链式调用

3. 字符转数字

char - '0'

4. 数组转字符

数字 + '0'

四、验证回文串

问题

将所有大写字符转换为小写字符,并移除所有非字母数字字符后,短语正着读和反着读都一样,则认为该短语是一个回文串。
示例:

输入:s = "A man, a plan, a canal: Panama"

输出:true

代码

方法一:使用函数

  1. 去除所有非字母的字符并转换大小写
  2. 反转字符
  3. 判断是否相等
java 复制代码
class Solution {
    public boolean isPalindrome(String s) {
    	String clean = s.replaceAll("[^a-zA-Z0-9]","").toLowerCase();
        String reversed = new StringBuilder(clean).reverse().toString();
        return clean.equals(reversed);
    }
}

方法二:刷选+判断

  1. 生成一个可变字符串,并获取长度
  2. 循环:获取指定位置字符
  3. 判断:字符是否位字母,追加并转换大小写
  4. 字符串反转
  5. 判断是否相等
java 复制代码
class Solution {
    public boolean isPalindrome(String s) {
        StringBuffer word = new StringBuffer();
        int length = s.length();
        for(int i=0;i<length;i++){
            char ch = s.charAt(i);
            if(Character.isLetterOrDigit(ch)){
                word.append(Character.toLowerCase(ch));
            }
        }
        StringBuffer word_rev = new StringBuffer(word).reverse();
        return word.toString().equals(word_rev.toString());
    }
}

涉及到的函数方法

1. replaceAll()

使用正则表达式来匹配字符串中的内容,并将所有匹配的部分替换为指定的字符串。

  1. 方法定义
java 复制代码
public String replaceAll(String regex, String replacement)
  1. 参数说明:
  • regex:正则表达式(要查找的内容)
  • replacement:替换的字符串
  1. 返回值:返回替换后的新字符串(原字符串不会被修改)

2. toLowerCase()

用于将字符串中的所有大写字母转换为小写字母

3. reverse()

用于反转字符序列,将字符串中的字符顺序完全颠倒。

  1. 返回值:
  • 返回反转后的同一个对象(不是新对象)
  • 支持方法链调用
  1. 基本反转:
java 复制代码
StringBuilder sb = new StringBuilder("Hello");
sb.reverse();
System.out.println(sb.toString()); // 输出 "olleH"
  1. 方法连调用:
java 复制代码
String result = new StringBuilder("Hello").reverse().toString();
System.out.println(result); // 输出 "olleH"

4. equals()

用于对象内容的比较

  1. ==操作符的区别
比较方式 比较内容 使用场景
== 比较内存地址(是否同一个对象) 基本数据类型、引用同一性检查
equals() 比较对象内容(逻辑上是否相等) 对象内容的比较
  1. 常见类的equals()行为
  • String类
  • Integer类
  • ArrayList类

5. append()

追加

6. Character 类

是 Java 的一个包装类,用于对单个字符进行操作。

提供的常见方法:

  • isLetter():判断是否为字母
  • isDigit():判断是否为数字
  • isLetterDigit():判断是否为字母或数字
  • isWgitespace():判断是否为空白字符
  • isLowerCase():判断是否为小写
  • isUpperCase():判断是否为大写
  • toLowerCase():转换为小写
  • toUpperCase():转换为大写

7. isLetterOrDigit()

是一个静态方法,用于判断指定字符是否是字母或数字。

  1. 返回值:boolean类型
  • 如果字符是字母或数字:返回true
  • 如果字符不是字母或数字:返回false
  1. 判断标准:
  • 字母:A-Z、a-z
  • 数字:0-9
  • 排除:空格、标点符号、特殊字符等

五、Excel表列名称

问题

一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。

A -> 1

B -> 2

C -> 3

...

Z -> 26

AA -> 27

AB -> 28

...
示例:

输入:columnNumber = 25

输出:"AB"

代码

方法一:数字

  1. 创建StringBuffer用于构建结果字符串
  2. 循环处理直到columnNumber为0
  3. 计算当前位的字符对应的数字(1-26对应A-Z)
  4. 将数字转换为对应的字母并添加到StringBuffer中
  5. 更新columnNumber,处理更高位
java 复制代码
class Solution {
    public String convertToTitle(int columnNumber) {
        StringBuffer sb = new StringBuffer();
        while(columnNumber>0){
            int a0 = (columnNumber - 1) % 26 + 1;
            sb.append((char)(a0-1+'A'));
            columnNumber = (columnNumber-a0)/26;
        }
        return sb.reverse().toString();
    }
}

方法二:代码优化

java 复制代码
class Solution {
    public String convertToTitle(int columnNumber) {
        StringBuffer sb = new StringBuffer();
        while(columnNumber!=0){
            columnNumber--;
            sb.append((char)(columnNumber%26+'A'));
            columnNumber/=26;
        }
        return sb.reverse().toString();
    }
}

涉及到的函数方法

1. 字母转换:

`(char)(a0 - 1 + 'A')

六、Excel表列序号

问题

一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。

A -> 1

B -> 2

C -> 3

...

Z -> 26

AA -> 27

AB -> 28

...
示例:

输入:columnTitle = "AB"

输出:28

代码

java 复制代码
class Solution {
    public int titleToNumber(String columnTitle) {
        int ans = 0;
        for(int i=0;i<columnTitle.length();i++){
            int num = columnTitle.charAt(i)-'A' + 1;
            ans = ans * 26 +num;
        }
        return ans;
    }
}
相关推荐
CoovallyAIHub14 小时前
无人机小目标检测新SOTA:MASF-YOLO重磅开源,多模块协同助力精度飞跃
深度学习·算法·计算机视觉
惯导马工14 小时前
【论文导读】FormerReckoning Physics Inspired Transformer for Accurate Inertial Navigat
深度学习·算法
THMAIL14 小时前
机器学习从入门到精通 - 模型部署落地:Docker+Flask构建API服务全流程
人工智能·python·算法·机器学习·docker·flask·逻辑回归
obroccolio14 小时前
【C++题解】关联容器
开发语言·数据结构·c++·算法
沐怡旸14 小时前
【算法--链表】25.K个一组翻转链表--通俗讲解
算法·面试
快去睡觉~14 小时前
力扣190:颠倒二进制位
数据结构·算法·leetcode
惯导马工15 小时前
【论文导读】CTIN: Robust Contextual Transformer Network for Inertial Navigation
算法
骑驴看星星a15 小时前
皮尔逊相关(Pearson)和斯皮尔曼相关(Spearman)显著性检验
算法·数学建模·回归·线性回归
翻滚丷大头鱼15 小时前
android View详解—自定义ViewGroup,流式布局
android·数据结构