学习目标:
提示:这里可以添加学习目标
leetcode刷题
最长公共前缀:
题目描述:
编写一个函数来查找字符串数组中的最长公共前缀。
解题思路:
横向比较:依次比较数组中的每一对字符串,找到它们的最长公共前缀。
纵向扫描:从左到右逐列比较所有字符串的字符,直到找到不同的字符。
public class Solution {
public String longestCommonPrefix(String[] strs) {
if (strs.length == 0) return "";
String prefix = strs[0];
for (int i = 1; i < strs.length; i++) {
while (strs[i].indexOf(prefix) != 0) {
prefix = prefix.substring(0, prefix.length() - 1);
if (prefix.isEmpty()) return "";
}
}
return prefix;
}
}
合并两个有序数组
题目描述:
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
解题思路:
从后向前遍历两个数组,比较元素大小,将较大的元素放到 nums1 的末尾。
如果 nums2 中还有剩余元素,直接复制到 nums1 的前面。
public int[] combineTwoList(int[] aList, int[] bList) {
if (aList == null) {
return bList;
}
if (bList == null) {
return aList;
}
int a = aList.length - 1, b = bList.length - 1, c = a + b + 1;
int[] result = new int[c + 1];
while (a >= 0 && b >= 0) {
if (aList[a] >= bList[b]) {
result[c] = aList[a];
a--;
} else {
result[c] = bList[b];
b--;
}
c--;
}
while (b >= 0) {
result[c] = bList[b];
b--;
c--;
}
return result;
}
无重复字符的最长子串
题目描述:
给定一个字符串 s,请你找出其中不含有重复字符的最长子串的长度。
解题思路:
使用滑动窗口技术,维护一个窗口 [left, right],表示当前无重复字符的子串。
使用哈希表记录字符及其索引。
遍历字符串,如果当前字符已经在哈希表中,更新 left 指针;否则,更新哈希表和最大长度。
import java.util.HashMap;
import java.util.Map;
public class Solution {
public int lengthOfLongestSubstring(String s) {
Map<Character, Integer> map = new HashMap<>();
int left = 0, maxLength = 0;
for (int right = 0; right < s.length(); right++) {
char c = s.charAt(right);
if (map.containsKey(c)) {
left = Math.max(left, map.get(c) + 1);
}
map.put(c, right);
maxLength = Math.max(maxLength, right - left + 1);
}
return maxLength;
}
}
回文数
题目描述:
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
解题思路:
将整数转换为字符串。
检查字符串是否与其反转后的字符串相同。
public class Solution {
public boolean isPalindrome(int x) {
String s = String.valueOf(x);
int left =