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


    力扣上面说 Level 1和 Level 2 学习计划是为初级用户和中级用户准备的,题目覆盖了大多数中层公司面试时所必需的数据结构和算法,Level 3 学习计划则是为准备面试顶级公司的用户准备的。我觉得这些题挺重要的,所以把他单独拿出来写博客。

    目录

    第一天

    第一题、一维数组的动态和

    思路

    代码

    第二题、寻找数组的中心下标

    思路

    代码

    第二天

    第一题、同构字符串

    思路一

    代码一

    思路二

    代码二

    第二题、判断子序列

    思路

    代码


    第一天

    第一题、一维数组的动态和

    思路

    读完题意,首先知道我们的目标,就是以数组下标为基准,把数组前几个数加起来,放到这个下标所在的位置,最后返回。

    这里我是直接就在原数组上修改的,观察规律得出:nums[i] = nums[i-1] + nums[i] ,按照这个就做出来了。

    代码

    1. /**
    2. * 原地修改
    3. * 从下标 1 开始遍历数组,然后每次让 nums[i] = nums[i-1] + nums[i]
    4. * @param nums
    5. * @return
    6. */
    7. public int[] runningSum(int[] nums) {
    8. for (int i = 1; i < nums.length; i++) {
    9. nums[i] = nums[i-1] + nums[i];
    10. }
    11. return nums;
    12. }

    第二题、寻找数组的中心下标

    思路

    分别定义两个值代表左边值的和 与  右边值的和,先把左值设为0,右值设为数组值的和,这样一步步向后走,看什么时候两值相等。

    代码

    1. public int pivotIndex(int[] nums) {
    2. int left_sum = 0;
    3. int right_sum = Arrays.stream(nums).sum();
    4. for (int i = 0; i < nums.length; i++) {
    5. right_sum -= nums[i];
    6. if (left_sum == right_sum) {
    7. return i;
    8. }
    9. left_sum += nums[i];
    10. }
    11. return -1;
    12. }

    第二天

    第一题、同构字符串

    思路一

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

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

     由上图可以得出:

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

    这个时候我们就考虑遍历字符串,分别用哈希表 s_tt_s 来表示 s->tt->s 的映射关系。然后对比就可以了。

    代码一

    1. public boolean isIsomorphic(String s, String t) {
    2. Map s_t = new HashMap<>();
    3. Map t_s = new HashMap<>();
    4. for (int i = 0; i < s.length(); i++) {
    5. char sch = s.charAt(i);
    6. char tch = t.charAt(i);
    7. //如果字符不匹配说明映射不是一一对应的,就返回false 并且 不存在那种字符没有对应上的情况
    8. if (s_t.containsKey(sch) && s_t.get(sch) != tch || t_s.containsKey(tch) && t_s.get(tch) != sch) {
    9. return false;
    10. }
    11. s_t.put(sch,tch);
    12. t_s.put(tch,sch);
    13. }
    14. return true;
    15. }

    思路二

    事先声明,这个思路二是因为我自己用哈希做出来后看超过的人数并不多,然后我就看题解,发现大佬们的方法,代码简易程度确实超过我很多,这个思路是我参考大佬的思路写的。

    按着大佬的思路来,意思就是题意判断为 false 的情况有两种,这里是拿s串和t串做对比,第一种:s串中相同的字符,对应的t串中的字符并不相等。第二种:.s串中不同的字符,对应的t串中的字符却是相等的。所以判断的关键点就是相同的字符要对应相同的字符,那么相同字符处于后位置的字符的第一次出现的位置就应该相同。既然如此我们在判断时,只需要判断两个字符串同位置的字符是否相同即可。

    代码二

    1. public boolean isIsomorphic(String s, String t) {
    2. char[] ch1 = s.toCharArray();
    3. char[] ch2 = t.toCharArray();
    4. for (int i = 0; i < s.length(); i++) {
    5. if (s.indexOf(ch1[i]) != t.indexOf(ch2[i])) {
    6. return false;
    7. }
    8. }
    9. return true;
    10. }

    第二题、判断子序列

    思路

    拿到这个题的第一时间我就想到了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++。

    代码

    1. public boolean isSubsequence(String s, String t) {
    2. if (s.length() == 0) {
    3. return true;
    4. }
    5. for (int i = 0, j = 0; j < t.length(); j++) {
    6. if (s.charAt(i) == t.charAt(j)) {
    7. if (++i == s.length())
    8. return true;
    9. }
    10. }
    11. return false;
    12. }

  • 相关阅读:
    SpringSecurity系列——会话管理,CSRFday8-1(源于官网5.7.2版本)
    第七十二天 P1025 [NOIP2001 提高组] 数的划分
    实验7-3-6 字符串转换成十进制整数(PTA)
    【技术分享】万字长文图文并茂读懂高性能无锁 “B-Tree 改”:Bw-Tree
    HarmonyOS原子化服务案例分享-邻居
    JAVA代码审计——SQL注入靶场审计01
    Node.js 应用程序的 Docker 安全最佳实践
    SQL审核 | 如何利用 OpenAPI 实现自己的扫描任务
    Netty学习------2024/02/19
    Electron-builder打包和自动更新
  • 原文地址:https://blog.csdn.net/qq_52592775/article/details/126311666