力扣学习计划75题-第一篇

发布于:2023-01-18 ⋅ 阅读:(227) ⋅ 点赞:(0)

力扣上面说 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;
    }

第二天

第一题、同构字符串

思路一

拿到这个题第一时间我看到映射两字,首先我就想到了 哈希

看下图是我画的几种字符对应关系

 由上图可以得出:

  1. 每个出现的字符都应当映射到另一个字符”。代表字符集合 s , t 之间是一一对应的关系。
  2. 相同位置的字符只能映射到相同位置上。 

这个时候我们就考虑遍历字符串,分别用哈希表 s_tt_s 来表示 s->tt->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;
    }


网站公告

今日签到

点亮在社区的每一天
去签到