ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

算法题今日总结(20210801)

2021-08-01 21:01:39  阅读:143  来源: 互联网

标签:总结 子串 字符 重复 相加 链表 20210801 算法 指针


目录

1. 变位词组

2. 两数相加

3. 无重复字符的最长子串


1. 变位词组

对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。

例子:

输入: ["eat", "tea", "tan", "ate", "nat", "bat"],
输出:
[
  ["ate","eat","tea"],
  ["nat","tan"],
  ["bat"]
]

解题方法:

1. 遍历输入集,记录每个字符串中每个字符及出现的次数作为hash表的key

2. 对每个字符串按字符排序,相同的字符归为一组

大神优秀题解法:

 public List<List<String>> groupAnagrams(String[] strs) {
        return new ArrayList<>(Arrays.stream(strs)
                .collect(Collectors.groupingBy(s -> s.chars()
                        .sorted().mapToObj(t -> String.valueOf((char) t))
                        .reduce(String::concat)))
                .values());
    }

流式处理:先把入参转List, 字符排序然后相同的归一组

额外了解到的map方法:

List<String> tempList = map.getOrDefault(key, new ArrayList<String>();

一行代码可以减少判断

2. 两数相加

两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

解题方法:

1.  遍历两链表,依次相加

踩坑:

1. 将链表数据转换为long,然后数值相加,测试数据超出long类型的最大值,计算结果错误

2. 最后一位相加时,进位1为做处理。

3. 无重复字符的最长子串

找出其中不含有重复字符的 最长子串 的长度。

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 “abc”, 所以输出3

解题方法:

1. 遍历字符,记录每个字符及下标,当重复出现时,遍历指针跳到此字符下标的地方,记录此子串的长度,后续子串长度大于此子串,则覆盖返回结果

2. 左右指针,左指针依次递增,左指针每移动一次,右指针移动直到出现重复字符,此时左指针和右指针之间的字符为不包含重复的子串,每次记录最大长度。

今日小结:

1. 做题是总是想的太简单,基本都是暴力解法

2. 特殊情况,边界值的考虑不到位

标签:总结,子串,字符,重复,相加,链表,20210801,算法,指针
来源: https://blog.csdn.net/qq_27876223/article/details/119302770

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有