首页 > 编程语言 >力扣热门算法题 349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码

力扣热门算法题 349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码

时间:2024-04-03 09:58:20浏览次数:23  
标签:字符 char int 力扣 num 394 字符串 currentStr

349. 两个数组的交集,387. 字符串中的第一个唯一字符,394. 字符串解码,每题做详细思路梳理,配套Python&Java双语代码, 2024.04.02 可通过leetcode所有测试用例

目录

349. 两个数组的交集

解题思路

完整代码

Python

Java

387. 字符串中的第一个唯一字符

解题思路

完整代码

Python

Java

394. 字符串解码

解题思路

完整代码

Python

Java


349. 两个数组的交集

给定两个数组 nums1 和 nums2 ,返回 它们的 

交集

 。输出结果中的每个元素一定是  唯一 的。我们可以  不考虑输出结果的顺序 。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

解题思路

  1. 使用两个哈希集合:一个集合 set1 存储 nums1 中的元素,另一个集合 set2 用来存储 nums2 中的元素。

  2. 填充第一个集合:遍历数组 nums1,将其中的元素加入 set1。哈希集合会自动处理重复元素,确保 set1 中的元素唯一。

  3. 查找交集:遍历数组 nums2,检查每个元素是否已存在于 set1 中。如果存在,说明该元素是两个数组的交集的一部分,将其加入 set2。这样做的原因是 set2 此时用于存储交集结果,也能自动去重。

  4. 转换结果:最后,将 set2 中的元素转换成数组形式返回,这些元素就是两个数组的交集。

完整代码

Python
class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        set1 = set(nums1)
        set2 = set()
        
        for num in nums2:
            if num in set1:
                set2.add(num)
        
        return list(set2)
Java
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> resultSet = new HashSet<>();
        
        // 填充第一个集合
        for (int num : nums1) {
            set1.add(num);
        }
        
        // 查找交集
        for (int num : nums2) {
            if (set1.contains(num)) {
                resultSet.add(num);
            }
        }
        
        // 转换结果
        int[] result = new int[resultSet.size()];
        int i = 0;
        for (int num : resultSet) {
            result[i++] = num;
        }
        
        return result;
    }
}

387. 字符串中的第一个唯一字符

给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。

示例 1:

输入: s = "leetcode"
输出: 0

示例 2:

输入: s = "loveleetcode"
输出: 2

示例 3:

输入: s = "aabb"
输出: -1

解题思路

  1. 统计字符频率:遍历字符串 s 一次,使用哈希表(如 Python 中的字典或 Java 中的 HashMap)来统计每个字符出现的次数。

  2. 找到第一个不重复字符:再次遍历字符串 s,使用之前构建的哈希表来检查每个字符的频率。第一个频率为 1 的字符就是我们要找的第一个不重复字符,此时返回它的索引。

  3. 处理未找到的情况:如果遍历结束仍未找到频率为 1 的字符,则说明没有不重复的字符,返回 -1。

完整代码

Python
class Solution:
    def firstUniqChar(self, s: str) -> int:
        # 使用哈希表统计每个字符的频率
        charCount = {}
        for char in s:
            charCount[char] = charCount.get(char, 0) + 1
        
        # 查找第一个不重复的字符
        for i, char in enumerate(s):
            if charCount[char] == 1:
                return i
        
        # 如果没有不重复的字符,返回-1
        return -1
Java
class Solution {
    public int firstUniqChar(String s) {
        // 使用哈希表统计每个字符的频率
        HashMap<Character, Integer> charCount = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            charCount.put(c, charCount.getOrDefault(c, 0) + 1);
        }
        
        // 查找第一个不重复的字符
        for (int i = 0; i < s.length(); i++) {
            if (charCount.get(s.charAt(i)) == 1) {
                return i;
            }
        }
        
        // 如果没有不重复的字符,返回-1
        return -1;
    }
}

394. 字符串解码

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例 1:

输入:s = "3[a]2[bc]"
输出:"aaabcbc"

示例 2:

输入:s = "3[a2[c]]"
输出:"accaccacc"

示例 3:

输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"

示例 4:

输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"

解题思路

  1. 创建两个栈:一个用于保存数字(即重复次数),另一个用于保存字符串。

  2. 遍历输入字符串:对每个字符进行处理:

    • 如果遇到数字,解析整个数字(因为数字可能超过一位),并将其压入数字栈。
    • 如果遇到字母,将其添加到当前字符串中。
    • 如果遇到'[',表示一个新的编码字符串的开始,因此需要将当前字符串压入字符串栈,然后重置当前字符串。
    • 如果遇到']',表示一个编码字符串的结束,此时应从数字栈中弹出一个数字,表示重复次数,并从字符串栈中弹出字符串(如果有的话),将当前字符串重复指定次数后,与弹出的字符串连接起来,更新当前字符串。
  3. 返回解码后的字符串:遍历完成后,当前字符串即为解码后的字符串。

完整代码

Python
class Solution:
    def decodeString(self, s: str) -> str:
        numStack = []  # 存储重复次数
        strStack = []  # 存储字符串
        currentNum = 0
        currentStr = ''
        
        for char in s:
            if char.isdigit():
                currentNum = currentNum * 10 + int(char)  # 构建多位数
            elif char == '[':
                # 遇到 '[',将当前数字和字符串分别压栈,然后重置
                numStack.append(currentNum)
                strStack.append(currentStr)
                currentNum, currentStr = 0, ''
            elif char == ']':
                # 遇到 ']',弹出栈顶数字,重复当前字符串,并与栈顶字符串连接
                num = numStack.pop()
                prevStr = strStack.pop()
                currentStr = prevStr + num * currentStr
            else:
                currentStr += char  # 构建字符串
        
        return currentStr
Java
class Solution {
    public String decodeString(String s) {
        Stack<Integer> numStack = new Stack<>();
        Stack<String> strStack = new Stack<>();
        String currentStr = "";
        int currentNum = 0;
        
        for (char ch : s.toCharArray()) {
            if (Character.isDigit(ch)) {
                currentNum = currentNum * 10 + (ch - '0');
            } else if (ch == '[') {
                // 遇到 '[',将当前数字和字符串分别压栈,然后重置
                numStack.push(currentNum);
                strStack.push(currentStr);
                currentNum = 0;
                currentStr = "";
            } else if (ch == ']') {
                // 遇到 ']',弹出栈顶数字,重复当前字符串,并与栈顶字符串连接
                StringBuilder tempStr = new StringBuilder(strStack.pop());
                int repeatTimes = numStack.pop();
                for (int i = 0; i < repeatTimes; i++) {
                    tempStr.append(currentStr);
                }
                currentStr = tempStr.toString();
            } else {
                currentStr += ch;
            }
        }
        
        return currentStr;
    }
}

标签:字符,char,int,力扣,num,394,字符串,currentStr
From: https://blog.csdn.net/qq_52213943/article/details/137330124

相关文章

  • 字符串相关知识与练习
    字符串(String):是用一对双引号括起来的零个或多个字符组成的有限序列。在Java中,字符串被当作对象来处理。程序中需要用到的字符串可以分为两大类:String类:创建之后不会再做修改和变动的字符串常量;StringBuffer类:创建之后允许再做更改和变化的字符串变量。一:找处连续最长数字......
  • mongodb连接字符串
    mongodb://localhost:27017mongodb://root:123456@localhost:27017/testdb?authSource=admin1、连接本地数据库服务器,端口是默认的。mongodb://localhost2、使用用户名fred,密码foobar登录localhost的admin数据库。mongodb://fred:foobar@localhost3、使用用户名fred,密码fo......
  • 子集与全排列问题(力扣78,90,46,47)
    系列文章目录子集和全排列问题与下面的组合都是属于回溯方法里的,相信结合前两期,再看这篇笔记,更有助于大家对本系列的理解一、组合回溯问题二、组合总和问题文章目录系列文章目录题目子集一、思路二、解题方法三、Code子集II一、思路二、解题方法三、Code全排列一......
  • Transformer学习-最简DEMO实现字符串转置
    Transformer学习-最简DEMO实现字符串转置一.代码二.参考三.输出背景:调试AI加速卡在Pytorch训练时的精度问题,搭建了一个简单的Transformer,设置随机种子,保证每次重训练loss完全一致,可以直接对比各算子的计算误差一.代码importosimportrandomimportnumpya......
  • 07字符串内置方法_列表的内置方法_列表操作_字典的内置方法
    【一】字符串内置方法【1】find方法name="dreamHello"#默认是从左向右找并且返回当前字符在字符串内部的索引坐标print(name.find('d'))#0#默认只能找一次,找到了就不会再找下去了print(name.find('e'))#2#可以指定寻找的区间print(name.find('e',5,-1))#7......
  • 【蓝桥杯】小明发明了一种给由全大写字母组成的字符串编码的方法。对于每一个大写字母
    【问题描述】小明发明了一种给由全大写字母组成的字符串编码的方法。对于每一个大写字母,小明将它转换成它在26个英文字母中序号,即A→1,B→2,...Z→26。这样一个字符串就能被转化成一个数字序列:比如ABCXYZ→123242526。现在给定一个转换后的数字序列,小明想还原出原本的......
  • 蓝桥杯备考随手记: 字符串转换
    在Java中,字符串转换是指将一个数据类型的变量转换成字符串类型的操作。字符串转换可以通过以下几种方式实现:使用String类的valueOf()方法:该方法可以将任意数据类型转换成字符串类型。例如:intnum=10;Stringstr=String.valueOf(num);该方法还可以用于将字符数组转换......
  • 部分数据类型的内置方法及字符串内置方法
    昨日内容回顾【一】循环结构【1】while循环break:退出当前循环coutinue:退出本次循环tag:标志位,可以通过最里层的标志位直接将最外层的while循环断掉【2】for循环遍历可迭代类型(可以被索引取值的都可以被迭代,可一个个取值的就是可迭代的)遍历的意思就是将被需要遍历的......
  • 判断两个字符串s1和s2是否为翻转字符串,即其中一个字符串是另一个字符串的翻转。
    算法:判断两个字符串s1和s2是否为翻转字符串,即其中一个字符串是另一个字符串的翻转。解决思路:首先检查两个字符串的长度是否相等,如果不相等则返回false。然后将两个字符串拼接起来得到result,并通过contains()方法检查result是否包含s1,如果包含则返回true,否则返回false。代码示例:......
  • 将字符串中的所有空格替换为“%20”
    算法:将字符串中的所有空格替换为“%20”解决思路:首先使用StringBuilder对象,之后用For循环遍历并判断字符,最后将StringBuilder对象转换为String对象。代码示例:publicStringreplaceSpaces(StringS,intlength){StringBuildersb=newStringBuilder();......