【Java】String字符串经典编程题速通指南
引言
在 Java 编程中,String
类是最常见且重要的工具之一。字符串处理在面试中也屡见不鲜,许多经典问题都围绕字符串展开。本文将带你速通几道 Java 中关于字符串的经典编程题,从常见的题型到高效的解法,并深入探讨每道题背后的思路与实现细节,帮助你迅速掌握并提升字符串处理的能力。
1. 反转字符串
题目描述:
给定一个字符串,编写一个方法反转该字符串并返回。例如,输入 "hello"
,返回 "olleh"
。
解法思路:
- 双指针法: 从头尾向中间交换字符。时间复杂度为 O(n)。
- 使用内置方法: 利用
StringBuilder
的reverse()
方法。
代码实现:
public class ReverseString {
public static String reverse(String s) {
StringBuilder reversed = new StringBuilder(s);
return reversed.reverse().toString();
}
public static void main(String[] args) {
System.out.println(reverse("hello")); // 输出: olleh
}
}
细节解析:
StringBuilder
是 Java 中处理可变字符串的常用工具,内部维护了可变字符数组,反转操作在时间上非常高效。
2. 检查字符串是否是回文
题目描述:
判断给定的字符串是否是回文。回文是指正反读都一样的字符串,例如 "radar"
是回文,而 "hello"
不是。
解法思路:
- 双指针法: 一个指针从字符串的起始位置开始,另一个从末尾开始,逐步比较字符是否相等。
代码实现:
public class PalindromeCheck {
public static boolean isPalindrome(String s) {
int left = 0, right = s.length() - 1;
while (left < right) {
if (s.charAt(left) != s.charAt(right)) {
return false;
}
left++;
right--;
}
return true;
}
public static void main(String[] args) {
System.out.println(isPalindrome("radar")); // 输出: true
System.out.println(isPalindrome("hello")); // 输出: false
}
}
细节解析:
- 双指针法在回文问题中尤其高效,避免了对整个字符串的多余遍历,时间复杂度为 O(n),空间复杂度为 O(1)。
3. 统计字符出现次数
题目描述:
编写一个方法统计字符串中每个字符的出现次数,并返回结果。例如,输入 "hello"
,输出 {h=1, e=1, l=2, o=1}
。
解法思路:
- 使用
HashMap
存储每个字符及其对应的计数。遍历字符串时,遇到字符则更新计数。
代码实现:
import java.util.HashMap;
public class CharacterCount {
public static HashMap<Character, Integer> countCharacters(String s) {
HashMap<Character, Integer> charCount = new HashMap<>();
for (char c : s.toCharArray()) {
charCount.put(c, charCount.getOrDefault(c, 0) + 1);
}
return charCount;
}
public static void main(String[] args) {
System.out.println(countCharacters("hello"));
}
}
细节解析:
HashMap
通过键值对存储字符及其出现次数,getOrDefault()
方法简化了逻辑。时间复杂度为 O(n),空间复杂度也为 O(n)。
4. 判断两个字符串是否由相同字符组成
题目描述:
给定两个字符串,判断它们是否由相同的字符组成,即每个字符的出现次数一致。例如,输入 "abc"
和 "bca"
,返回 true
。
解法思路:
- 可以对两个字符串分别排序,然后逐个比较字符是否相同。
- 也可以使用
HashMap
统计两个字符串中各字符的频次,判断频次是否一致。
代码实现:
import java.util.Arrays;
public class AnagramCheck {
public static boolean areAnagrams(String s1, String s2) {
if (s1.length() != s2.length()) {
return false;
}
char[] s1Array = s1.toCharArray();
char[] s2Array = s2.toCharArray();
Arrays.sort(s1Array);
Arrays.sort(s2Array);
return Arrays.equals(s1Array, s2Array);
}
public static void main(String[] args) {
System.out.println(areAnagrams("abc", "bca")); // 输出: true
System.out.println(areAnagrams("abc", "def")); // 输出: false
}
}
细节解析:
- 通过排序解决异构词问题,时间复杂度为 O(n log n),使用
Arrays.equals()
方法判断数组是否相等简化了代码逻辑。
5. 找出第一个不重复的字符
题目描述:
给定一个字符串,找出其中第一个不重复的字符,并返回其索引。如果不存在,返回 -1。
解法思路:
- 使用
HashMap
记录字符的出现次数,然后再次遍历字符串,找出第一个出现次数为 1 的字符。
代码实现:
import java.util.HashMap;
public class FirstUniqueChar {
public static int firstUniqChar(String s) {
HashMap<Character, Integer> countMap = new HashMap<>();
for (char c : s.toCharArray()) {
countMap.put(c, countMap.getOrDefault(c, 0) + 1);
}
for (int i = 0; i < s.length(); i++) {
if (countMap.get(s.charAt(i)) == 1) {
return i;
}
}
return -1;
}
public static void main(String[] args) {
System.out.println(firstUniqChar("leetcode")); // 输出: 0
System.out.println(firstUniqChar("loveleetcode")); // 输出: 2
}
}
细节解析:
- 双遍历方案,通过
HashMap
存储字符的频率,第一次遍历用于统计频次,第二次遍历则用于查找不重复字符。时间复杂度为 O(n),空间复杂度为 O(n)。
结语
这些经典的字符串编程题目在 Java 开发中极具代表性,理解它们的解法不仅能帮助你在面试中脱颖而出,还能在实际开发中快速处理字符串问题。每道题目背后都有多种解法,熟悉常见的优化思路和核心技巧,将让你在编程中事半功倍。
感谢大家的支持和关注 下面是我的公众号如果能给大家带来帮助的话感谢关注
原文地址:https://blog.csdn.net/m0_61118741/article/details/142500434
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!