力扣上面说 Level 1和 Level 2 学习计划是为初级用户和中级用户准备的,题目覆盖了大多数中层公司面试时所必需的数据结构和算法,Level 3 学习计划则是为准备面试顶级公司的用户准备的。我觉得这些题挺重要的,所以把他单独拿出来写博客。
目录
第一天
第一题、一维数组的动态和
思路
读完题意,首先知道我们的目标,就是以数组下标为基准,把数组前几个数加起来,放到这个下标所在的位置,最后返回。
这里我是直接就在原数组上修改的,观察规律得出:nums[i] = nums[i-1] + nums[i] ,按照这个就做出来了。
代码
/**
* 原地修改
* 从下标 1 开始遍历数组,然后每次让 nums[i] = nums[i-1] + nums[i]
* @param nums
* @return
*/
public int[] runningSum(int[] nums) {
for (int i = 1; i < nums.length; i++) {
nums[i] = nums[i-1] + nums[i];
}
return nums;
}
第二题、寻找数组的中心下标
思路
分别定义两个值代表左边值的和 与 右边值的和,先把左值设为0,右值设为数组值的和,这样一步步向后走,看什么时候两值相等。
代码
public int pivotIndex(int[] nums) {
int left_sum = 0;
int right_sum = Arrays.stream(nums).sum();
for (int i = 0; i < nums.length; i++) {
right_sum -= nums[i];
if (left_sum == right_sum) {
return i;
}
left_sum += nums[i];
}
return -1;
}
第二天
第一题、同构字符串
思路一
拿到这个题第一时间我看到映射两字,首先我就想到了 哈希。
看下图是我画的几种字符对应关系
由上图可以得出:
- 每个出现的字符都应当映射到另一个字符”。代表字符集合
s
,t
之间是一一对应的关系。 - 相同位置的字符只能映射到相同位置上。
这个时候我们就考虑遍历字符串,分别用哈希表 s_t 和 t_s 来表示 s->t 和 t->s 的映射关系。然后对比就可以了。
代码一
public boolean isIsomorphic(String s, String t) {
Map<Character,Character> s_t = new HashMap<>();
Map<Character,Character> t_s = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
char sch = s.charAt(i);
char tch = t.charAt(i);
//如果字符不匹配说明映射不是一一对应的,就返回false 并且 不存在那种字符没有对应上的情况
if (s_t.containsKey(sch) && s_t.get(sch) != tch || t_s.containsKey(tch) && t_s.get(tch) != sch) {
return false;
}
s_t.put(sch,tch);
t_s.put(tch,sch);
}
return true;
}
思路二
事先声明,这个思路二是因为我自己用哈希做出来后看超过的人数并不多,然后我就看题解,发现大佬们的方法,代码简易程度确实超过我很多,这个思路是我参考大佬的思路写的。
按着大佬的思路来,意思就是题意判断为 false 的情况有两种,这里是拿s串和t串做对比,第一种:s串中相同的字符,对应的t串中的字符并不相等。第二种:.s串中不同的字符,对应的t串中的字符却是相等的。所以判断的关键点就是相同的字符要对应相同的字符,那么相同字符处于后位置的字符的第一次出现的位置就应该相同。既然如此我们在判断时,只需要判断两个字符串同位置的字符是否相同即可。
代码二
public boolean isIsomorphic(String s, String t) {
char[] ch1 = s.toCharArray();
char[] ch2 = t.toCharArray();
for (int i = 0; i < s.length(); i++) {
if (s.indexOf(ch1[i]) != t.indexOf(ch2[i])) {
return false;
}
}
return true;
}
第二题、判断子序列
思路
拿到这个题的第一时间我就想到了C语言中的字符串函数 strstr(),但是java没有这个函数,所以我们模拟实现一下就差不多了。在我C语言的专栏里面专门讲了字符串函数,有兴趣的小伙伴可以看看:字符函数和字符串函数_即将秃头的菜鸟的博客-CSDN博客
但是请注意,这个题并不是简单的 strstr 函数,看上图示例1,只要s字符串的所以字符是属于t字符串中的字符,那么就能返回true,这里和strstr函数是不一样的。所以我们使用双指针来求解,分别用 i 和 j 来指向 s 和 t 的第一个字符,然后遍历字符串t,当 s[i] == t[j]
时,代表匹配成功,此时同时 i++
, j++,
当 s[i] != t[j]
时,代表匹配失败,此时仅 j++。
代码
public boolean isSubsequence(String s, String t) {
if (s.length() == 0) {
return true;
}
for (int i = 0, j = 0; j < t.length(); j++) {
if (s.charAt(i) == t.charAt(j)) {
if (++i == s.length())
return true;
}
}
return false;
}