一 LC389.找不同
题目要求:
给定两个字符串
s
和t
,它们只包含小写字母。字符串
t
由字符串s
随机重排,然后在随机位置添加一个字母。请找出在
t
中被添加的字母。
思路分析:
方法一:计算两个字符串中每个字符出现的次数。然后遍历字符串t中的每个字符,如果该字符在s中出现的次数为0,那么这个字符就是被添加的字母。如果遍历完t中的所有字符都没有找到被添加的字母,那么说明t是空字符串,返回空字符串即可。
方法二:计算字符串s和t和字符之和(使用ASCII码实现),再计算两个ASCII码和的差值,该差值就是不同元素所对应的ASCII码。
方法三:位运算。
方法四:先将两个字符串转换为数组,将其排序,再一一比较对应元素是否不同。
完整代码示例:
class Solution {
public char findTheDifference(String s, String t) {
// 创建一个长度为26的数组,用于存储每个字符出现的次数
int[] count = new int[26];
// 遍历字符串s,统计每个字符出现的次数
for (char c : s.toCharArray()) {
count[c - 'a']++;
}
// 遍历字符串t,减去对应字符出现的次数
for (char c : t.toCharArray()) {
count[c - 'a']--;
// 如果某个字符出现次数为负数,说明这个字符是多余的,即被添加的字母
if (count[c - 'a'] < 0) {
return c;
}
}
// 如果遍历完t中的所有字符都没有找到被添加的字母,那么说明t是空字符串,返回空字符串即可
return '\0';
}
}
class Solution {
public char findTheDifference(String s, String t) {
int as = 0, at = 0;
for (int i = 0; i < s.length(); ++i) {
as += s.charAt(i);
}
for (int i = 0; i < t.length(); ++i) {
at += t.charAt(i);
}
return (char) (at - as);
}
}
public char findTheDifference(String s, String t) {
int len = s.length();
char[] chs = s.toCharArray();
char[] cht = t.toCharArray();
int res = 0;
for (int i = 0; i < len; i++) {
res ^= chs[i] ^ cht[I];
}
res ^= cht[len];
return (char) res;
}
class Solution {
public char findTheDifference(String s, String t) {
char[] sc = s.toCharArray();
char[] tc = t.toCharArray();
Arrays.sort(sc);
Arrays.sort(tc);
for(int i = 0; i < sc.length; i++) {
if(sc[i] != tc[i]) {
return tc[i];
}
}
return tc[tc.length - 1];
}
}
二 LC252.会议室
题目要求:
给定一个会议时间安排的数组
intervals
,每个会议时间都会包括开始和结束的时间intervals[i] = [starti, endi]
,请你判断一个人是否能够参加这里面的全部会议。
思路分析:
方法一:暴力破解。对数组进行排序,按照会议开始时间从小到大排序。遍历排序后的数组,比较当前会议的开始时间是否小于等于前一个会议的结束时间,如果是,则返回false,表示无法参加全部会议;否则,继续遍历下一个会议。如果遍历完所有会议都没有返回false,说明可以参加全部会议,返回true。
完整代码示例:
class Solution {
public boolean canAttendMeetings(int[][] intervals) {
// 对会议时间安排的数组进行排序,按照会议开始时间从小到大排序
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
// 遍历排序后的数组,比较当前会议的开始时间是否小于等于前一个会议的结束时间
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] < intervals[i - 1][1]) {
// 如果是,则返回false,表示无法参加全部会议
return false;
}
}
// 如果遍历完所有会议都没有返回false,说明可以参加全部会议,返回true
return true;
}
}
三 LC75.颜色分类
题目要求:
给定一个包含红色、白色和蓝色、共
n
个元素的数组nums
,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。我们使用整数
0
、1
和2
分别表示红色、白色和蓝色。必须在不使用库内置的 sort 函数的情况下解决这个问题。
思路分析:
遍历数组,当遇到红色时,将其与左边的白色元素交换;当遇到蓝色时,将其与右边的红色元素交换。
完整代码示例:
class Solution {
public void sortColors(int[] nums) {
int red = 0, white = 0, blue = nums.length - 1;
while (white <= blue) {
if (nums[white] == 0) {
swap(nums, red++, white++);
} else if (nums[white] == 1) {
white++;
} else {
swap(nums, white, blue--);
}
}
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}