LeetCode刷题笔记(2)HashMap相关应用
1.问题描述
Example 1:
Input: A = "this apple is sweet", B = "this apple is sour"
Output: ["sweet","sour"] Example 2:
Input: A = "apple apple", B = "banana"
Output: ["banana"]
要求:
- 某个单词在它自己所在的句子中仅出现一次。
- 某个单词在另外一个句子中没有出现过。
- 将两个句子中同时满足上述两个要求的单词输出到列表中。
2.我自己的解题思路
- 将两个字符串转换成List并且按照默认的排序规则排序,例如,将"uuz rk uuz"排序成"rk uuz uuz",这是为了在后面将在同一个句子中出现两次即以上的单词排除。
- 使用一个中间字符串tmp当做指针来按照List里面的顺序依次指向每个元素,由于有了前面的已经排好顺序的代码,所以这里采用的方法是,如果List中有某个单词出现了两次或两次以上,例如"rk uuz uuz",先将uuz加入到list中,然后比较第一个uuz和第二个uuz相同,将之前加入list的uuz移除。(由于对HashMap不太熟悉,使用这种方法也可以通过,但是会比较麻烦,复杂度也较高。)
- 在满足上面的判断条件后,判断某个单词是否在另外一个句子中出现过,如果没有出现过,就加入到结果集list中。
public String[] uncommonFromSentences(String A, String B) {
List<String> list = new LinkedList<>();
String[] aStr = A.split(" ");
String[] bStr = B.split(" ");
List<String> aList = Arrays.asList(aStr);
List<String> bList = Arrays.asList(bStr); Collections.sort(aList);
Collections.sort(bList); String tmp1 = "";
for (Iterator<String> iterator = aList.iterator(); iterator.hasNext();) {
String string = (String) iterator.next();
if (!tmp1.equals(string)) {
if (!bList.contains(string)) {
list.add(string);
tmp1 = string;
}
} else {
list.remove(tmp1);
} } String tmp2 = "";
for (Iterator<String> iterator = bList.iterator(); iterator.hasNext();) {
String string = (String) iterator.next();
if (!tmp2.equals(string)) {
if (!aList.contains(string)) {
list.add(string);
tmp2 = string;
}
} else {
list.remove(tmp2);
}
} String[] result = new String[list.size()];
list.toArray(result);
return result;
}
3.应该要用的解题思路:HashMap
使用HashMap集合将A和B两个句子中的所有单词作为键key,将每个单词对应的出现次数作为值value。
count.getOrDefault(word, 0)的意思是,如果集合中已经存在word这个键,就使用其对应的value值,否则,使用默认的值0,用来判断单词出现的次数。
然后统计HashMap集合中每个单词对应的值value,如果等于1就说明只出现了一次,然后加入到结果集ans中即可。
时间复杂度:O(M+N),M是A的复杂度,N是B的复杂度。
空间复杂度:O(M+N),使用的HashMap集合count所占用的空间。
class Solution {
public String[] uncommonFromSentences(String A, String B) {
Map<String, Integer> count = new HashMap();
for (String word: A.split(" "))
count.put(word, count.getOrDefault(word, 0) + 1);
for (String word: B.split(" "))
count.put(word, count.getOrDefault(word, 0) + 1); List<String> ans = new LinkedList();
for (String word: count.keySet())
if (count.get(word) == 1)
ans.add(word); return ans.toArray(new String[ans.size()]);
}
}
LeetCode刷题笔记(2)HashMap相关应用的更多相关文章
- LeetCode刷题笔记和想法(C++)
主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...
- 18.9.10 LeetCode刷题笔记
本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...
- LeetCode刷题笔记 - 12. 整数转罗马数字
学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...
- Leetcode刷题笔记(双指针)
1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ...
- LeetCode刷题笔记(1-9)
LeetCode1-9 本文更多是作为一个习题笔记,没有太多讲解 1.两数之和 题目请点击链接 ↑ 最先想到暴力解法,直接双循环,但是这样复杂度为n平方 public int[] twoSum(int ...
- leetcode刷题笔记
(1)Best Time to Buy and Sell Stock Total Accepted: 10430 Total Submissions: 33800My Submissions Say ...
- leetcode刷题笔记08 字符串转整数 (atoi)
题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...
- 【leetcode刷题笔记】Word Ladder II
Given two words (start and end), and a dictionary, find all shortest transformation sequence(s) from ...
- 【leetcode刷题笔记】Minimum Window Substring
Given a string S and a string T, find the minimum window in S which will contain all the characters ...
随机推荐
- Java 客户端服务器范例
最近在面试,虽然学习了一些新的框架,但是可能问类似于客户端服务器模型,然后根据其设计,所以就根据面试内容梳理一下客户端服务器模型. 客户端基本思路: 1.创建Socket实例,设置端口和IP地址等 2 ...
- Spring MVC-从零开始-分拆applicationContext. xrnl
1.目录结构 2.web.xml配置 <?xml version="1.0" encoding="ISO-8859-1"?> <web-app ...
- HDU 2044——一只小蜜蜂...(DP)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2044 题解 //递归思想,超时 #include<iostream> using namesp ...
- kotlin系列文章 --- 1.初识kotlin
简介 Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由Jetbrains设计开发,现在是Android官方开发语言,和Java具有互操作性,可以共存. 为什么选择kotlin? 简 ...
- windows下安装和设置gradle
一.安装前检查 检查jdk是否已经安装 二.下载gradle 1. https://gradle.org/releases/ 2.设置gradle环境变量 3. 环境变量中增加名为GRADLE_HOM ...
- [PHP] php, apache, VS Code安装与配置
1. 下载
- .net core session的使用步骤
步骤 操作 备注 1 Microsoft.AspNetCore.Session Microsoft.AspNetCore.Http.Extensions nuget安装包 2 ConfigureS ...
- 线程、进程概念与Android系统组件的关系
Android系统是Google公司基于Linux内核开发的开源手机操作系统.通过利用 Linux 内核的优势,Android 系统使用了大量操作系统服务,包括进程管理.内存管理.网络堆栈.驱动程序. ...
- 一份超级完整的PyCharm图解教程
微信搜索公众号:Python极客社区. 每天分享不一样的Python干货 PyCharm 是一种 Python IDE,可以帮助程序员节约时间,提高生产效率.那么具体如何使用呢?本文从 PyCharm ...
- oracle查询当前用户下所有的表,包括所有的字段
oracle查询当前用户下所有的表,包括所有的字段 背景: 前两天接到一个需求,做一个展示所有表名,表备注,表数据,表字段数,点击查看按钮查看字段名和注释,支持导出. 在Oracle中,可用使用视 ...