
力扣上面说 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
s_t = new HashMap<>(); - Map
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;
- }