目录
一、找出字符串中的第一个匹配项的下标
问题
两个字符串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);
}
}
方法二:暴力匹配
- 获取两个字符串的长度:h=haystack,n=needle;
- 外层循环:遍历主字符串中所有可能起始的位置;条件i+n<h,确保子字符串不会超出主字符串的边界;
- 设置标志位,初始假设当前位置匹配成功
- 内层循环:比较字符串的每个字符
- 逐个字符比较:主字符串从位置i+j开始的字符与子字符串位置j的位置
- 发现不匹配,标志位为false,跳出循环
- 检查内层循环结束后标志位的状态
- 遍历完所有可能位置都未找到匹配,返回-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():
查找子字符串在目标字符串中第一次出现的位置,从前往后找
- 参数:
- 可带要查找的字符:
indexOf('e')
查找e字符 - 可带要查找的子字符串:
indexOf('needle')
查找是否含有子字符串 - 可带开始搜索的起始位置:
indexOf('needle',2)
从下标2的位置开始查找是否含有子字符串
- 返回值:
- 找到时:返回字符串第一次出现的起始索引;
- 未找到时:返回-1
- 应用场景:
- 检查目标字符串是否包含子字符串
- 提取子字符串
- 统计字符出现次数
- 验证文件类型
- 扩展:
方法 | 功能 | 区别 |
---|---|---|
indexOf() |
查找第一次出现的位置 | 从前往后找 |
lastIndexOf() |
查找最后一次出现的位置 | 从后往前找 |
contains() |
检查是否包含子串 | 返回Boolean,内部调用indexOf() |
startWith() |
检查是否以某字符串开头 | 只检查开头 |
endWith() |
检查是否以某字符串结尾 | 只检查结尾 |
2. length()
返回字符串中包含字符的数量。
- 返回类型:
int
字符串的长度 - 注意:字符串是
length()
,数组是length
,数组中没有括号。 - 当为空字符串时,返回0;当字符串为null时,抛出异常;当字符串为特殊字符时,返回占用的字节
3. charAt()
用于返回字符串中指定索引位置的字符。
- 定义:
java
public char chartAt(Int index)
- 参数说明:index 指要获取的字符的索引位置(从0开始)
- 返回值:返回指定索引位置的
char
类型字符 - 与数组访问的区别
java
String str = "Hello";
char[] arr = {'H','e','l','l','o'};
// 两种访问方式
char c1 = str.charAt(2); // 字符串方式
char c2 = arr[2]; // 数组方式
- 应用场景:
- 遍历字符串
- 统计字符出现次数
- 字符串反转
二、最后一个单词的长度
问题
一个字符串s
,由若干个单词组成,单词前后用一些空格字符串隔开。返回字符串中最后一个单词的长度。
示例:
输入:s = "Hello World"
输出:5
代码
反向遍历:
- 从字符串末尾开始查找,初始化索引为字符串最后一个字符的位置
- 跳过末尾的索引空格:当当前字符串是空格时,索引向前移动
- 初始换单词长度计数器
- 计算最后一个单词的长度:当索引>=0且当前字符不是空格时
- 增加单词长度计数
- 索引继续向前检查
- 返回最后一个单词的长度
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;
}
}
涉及到的函数方法
length()
:返回字符串中包含字符的数量。charAt()
:用于返回字符串中指定索引位置的字符。
三、二进制求和
问题
两个二进制字符串a
和b
,以二进制字符串的形式返回它们的和。
示例:
输入:a = "1010" b = "1011"
输出:"10101"
代码
- 获取两个字符串的长度,从字符串末尾开始查找,初始化索引为字符串最后一个字符的位置
- 设置进位标志,初始索引为0(二进制进位只能是0或1)
- 使用StringBuilder 构建字符串
- 循环条件:任意字符串还有数组未处理 或 还有进位需要处理
- 当前位的总和初始化位进位值
- 如果字符串a还有数组未处理,加上该位的值
- char转int并移动指针
- 如果字符串b还有数组未处理,加上该位的值
- char转int并移动指针
- 计算当前位的结果:sum % 2(取余),然后转回char类型,插入到结果最前面
- 计算新的进位:sum / 2(二进制中除以2取整)
- 返回最终结果字符串
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 类中非常重要的一个方法。
用于在字符串构建器的指定位置插入数据。
- 方法定义
java
StringBuilder insert(int offset, 数据类型 value)
- 参数说明:
- offset:插入位置的索引
- value:要插入的值
- 返回值:返回 StringBuilder 对象本身
- 应用场景:
- 在特定位置插入字符
- 格式化字符串
- 插入多个数据类型
- 链式调用
3. 字符转数字
char - '0'
4. 数组转字符
数字 + '0'
四、验证回文串
问题
将所有大写字符转换为小写字符,并移除所有非字母数字字符后,短语正着读和反着读都一样,则认为该短语是一个回文串。
示例:
输入:s = "A man, a plan, a canal: Panama"
输出:true
代码
方法一:使用函数
- 去除所有非字母的字符并转换大小写
- 反转字符
- 判断是否相等
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);
}
}
方法二:刷选+判断
- 生成一个可变字符串,并获取长度
- 循环:获取指定位置字符
- 判断:字符是否位字母,追加并转换大小写
- 字符串反转
- 判断是否相等
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()
使用正则表达式来匹配字符串中的内容,并将所有匹配的部分替换为指定的字符串。
- 方法定义
java
public String replaceAll(String regex, String replacement)
- 参数说明:
- regex:正则表达式(要查找的内容)
- replacement:替换的字符串
- 返回值:返回替换后的新字符串(原字符串不会被修改)
2. toLowerCase()
用于将字符串中的所有大写字母转换为小写字母。
3. reverse()
用于反转字符序列,将字符串中的字符顺序完全颠倒。
- 返回值:
- 返回反转后的同一个对象(不是新对象)
- 支持方法链调用
- 基本反转:
java
StringBuilder sb = new StringBuilder("Hello");
sb.reverse();
System.out.println(sb.toString()); // 输出 "olleH"
- 方法连调用:
java
String result = new StringBuilder("Hello").reverse().toString();
System.out.println(result); // 输出 "olleH"
4. equals()
用于对象内容的比较。
- 与
==
操作符的区别
比较方式 | 比较内容 | 使用场景 |
---|---|---|
== |
比较内存地址(是否同一个对象) | 基本数据类型、引用同一性检查 |
equals() |
比较对象内容(逻辑上是否相等) | 对象内容的比较 |
- 常见类的equals()行为
- String类
- Integer类
- ArrayList类
5. append()
追加
6. Character 类
是 Java 的一个包装类,用于对单个字符进行操作。
提供的常见方法:
isLetter()
:判断是否为字母isDigit()
:判断是否为数字isLetterDigit()
:判断是否为字母或数字isWgitespace()
:判断是否为空白字符isLowerCase()
:判断是否为小写isUpperCase()
:判断是否为大写toLowerCase()
:转换为小写toUpperCase()
:转换为大写
7. isLetterOrDigit()
是一个静态方法,用于判断指定字符是否是字母或数字。
- 返回值:boolean类型
- 如果字符是字母或数字:返回true
- 如果字符不是字母或数字:返回false
- 判断标准:
- 字母:A-Z、a-z
- 数字:0-9
- 排除:空格、标点符号、特殊字符等
五、Excel表列名称
问题
一个整数 columnNumber ,返回它在 Excel 表中相对应的列名称。
A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...
示例:
输入:columnNumber = 25
输出:"AB"
代码
方法一:数字
- 创建StringBuffer用于构建结果字符串
- 循环处理直到columnNumber为0
- 计算当前位的字符对应的数字(1-26对应A-Z)
- 将数字转换为对应的字母并添加到StringBuffer中
- 更新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;
}
}