当前位置: 首页 > backend >正文

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

目录

  • 一、找出字符串中的第一个匹配项的下标
    • 问题
    • 代码
    • 涉及到的函数方法
      • 1. indexOf():
      • 2. length()
      • 3. charAt()
  • 二、最后一个单词的长度
    • 问题
    • 代码
    • 涉及到的函数方法
  • 三、二进制求和
    • 问题
    • 代码
    • 涉及到的函数方法
      • 1. StringBuilder
      • 2. insert()
      • 3. 字符转数字
      • 4. 数组转字符
  • 四、验证回文串
    • 问题
    • 代码
    • 涉及到的函数方法
      • 1. replaceAll()
      • 2. toLowerCase()
      • 3. reverse()
      • 4. equals()
      • 5. append()
      • 6. Character 类
      • 7. isLetterOrDigit()
  • 五、Excel表列名称
    • 问题
    • 代码
    • 涉及到的函数方法
      • 1. 字母转换:
  • 六、Excel表列序号
    • 问题
    • 代码

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

问题

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

代码

方法一:直接使用函数
查看haystack字符串是否含有needle字符串

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
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. 定义:
public char chartAt(Int index)
  1. 参数说明:index 指要获取的字符的索引位置(从0开始)
  2. 返回值:返回指定索引位置的char类型字符
  3. 与数组访问的区别
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. 返回最后一个单词的长度
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. 返回最终结果字符串
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. 方法定义
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. 判断是否相等
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. 判断是否相等
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. 方法定义
public String replaceAll(String regex, String replacement)
  1. 参数说明:
  • regex:正则表达式(要查找的内容)
  • replacement:替换的字符串
  1. 返回值:返回替换后的新字符串(原字符串不会被修改)

2. toLowerCase()

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

3. reverse()

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

  1. 返回值:
  • 返回反转后的同一个对象(不是新对象)
  • 支持方法链调用
  1. 基本反转:
StringBuilder sb = new StringBuilder("Hello");
sb.reverse();
System.out.println(sb.toString()); // 输出 "olleH"
  1. 方法连调用:
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,处理更高位
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();}
}

方法二:代码优化

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

代码

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;}
}
http://www.xdnf.cn/news/19941.html

相关文章:

  • ECMAScript (5)ES6前端开发核心:国际化与格式化、内存管理与性能
  • Lucene 8.7.0 版本的索引文件格式
  • uniapp vue页面传参到webview.nvue页面的html或者另一vue中
  • 架构-亿级流量性能调优实践
  • 【ICCV 2025 顶会论文】,新突破!卷积化自注意力 ConvAttn 模块,即插即用,显著降低计算量和内存开销。
  • 阿里云轻量应用服务器部署-WooCommerce
  • 剧本杀APP系统开发:引领娱乐行业新潮流的科技力量
  • 【RNN-LSTM-GRU】第三篇 LSTM门控机制详解:告别梯度消失,让神经网络拥有长期记忆
  • 【已更新文章+代码】2025数学建模国赛A题思路代码文章高教社杯全国大学生数学建模-烟幕干扰弹的投放策略
  • 达梦数据库-字典缓冲区 (二)-v2
  • void*指针类型转换笔记
  • C++ const以及相关关键字
  • Ubuntu 25.04搭建hadoop3.4.1集群详细教程
  • Access开发导出PDF的N种姿势,你get了吗?
  • 开源本地LLM推理引擎(Cortex AI)
  • OpenTenBase vs MySQL vs Oracle,企业级应用数据库实盘对比分析
  • 使用国外网络的核心问题有哪些?
  • 基于 epoll 的高并发服务器原理与实现(对比 select 和 poll)
  • 十七、单线程 Web 服务器
  • (自用)PowerShell常用命令自查文档
  • AI重构出海营销:HeadAI如何用“滴滴模式”破解红人营销效率困局?
  • Flink 网络消息队列 PrioritizedDeque
  • C52单片机独立按键模块,中断系统,定时器计数器以及蜂鸣器
  • OpenLayers常用控件 -- 章节三:鼠标位置坐标显示控件教程
  • 多线程入门到精通系列: 从操作系统到 Java 线程模型
  • 快鹭云业财一体化系统技术解析:低代码+AI如何破解数据孤岛难题
  • 飞算JavaAI开发在线图书借阅平台全记录:从0到1的实践指南
  • 【C++】详解形参和实参:别再傻傻分不清
  • Android adb shell命令分析应用内存占用
  • 2025全国大学生数学建模C题保姆级思路模型(持续更新):NIPT 的时点选择与胎儿的异常判定