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 ...
随机推荐
- Tomcat 报错 The APR based Apache Tomcat Native library which allows optimal performance in production environmen
这个问题在我一次重新装了tomcat和myeclipse时出现 说实话 出现这个问题头大 但是好在解决了 美滋滋 最开始到处寻找各种解决方案 最后直接注释了server.xml中的一行 直接解决这个报 ...
- Hadoop 文件系统命令行基础
Hadoop 命令行最常用指令篇: 1.ls (list directory) Usage: hadoop fs -ls [R] Option: -R => 递归显示 2.mkdir (mak ...
- linux&shell学习系列
1.VMware安装Centos7虚拟机 2.Linux之vim详解 3.linux后台运行的几种方式 4.linux权限管理 5.linux之用户和用户组管理详解 6.grep文本搜索工具详解 7. ...
- json与java对象的转换,以及struts2对json的支持,实现ajax技术
这两天学的东西有点多,今天抽个时间写下来,以此作为激励,这两天学了json,ajax,jQuery 一.使用第三方的工具java转换为json类型 首先就是java类型转换为json对象,首先要导入第 ...
- 正睿国庆DAY2动态规划专题
正睿国庆DAY2动态规划专题 排列-例题 1~n 的排列个数,每个数要么比旁边两个大,要么比旁边两个小 \(f[i][j]\) 填了前i个数,未填的数有\(j\)个比第\(i\)个小,是波峰 \(g[ ...
- 多线程基础(主要内容转载于https://segmentfault.com/a/1190000014428190)
进程作为资源分配的基本单位 线程作为资源调度的基本单位,是程序的执行单元,执行路径(单线程:一条执行路径,多线程:多条执行路径).是程序使用CPU的最基本单位. 线程有3个基本状态: 执行.就绪.阻塞 ...
- Spark 学习笔记之 distinct/groupByKey/reduceByKey
distinct/groupByKey/reduceByKey: distinct: import org.apache.spark.SparkContext import org.apache.sp ...
- 【Java】后台将文件上传至远程服务器
问题:由于系统在局域网(能访问外网)内,但外网无法请求局域网内服务器文件和进行处理文件. 解决:建立文件服务器,用于存储文件及外网调用. 客户端(文件上传): package cn.hkwl.lm.u ...
- java的动手动脑10月20日
(1)动手动脑 该函数没有赋初值再就是如果类提供一个自定义的构造方法,将导致系统不在提供默认的构造方法. (2) public class test { /*** @param args*/publi ...
- 洛谷 1552 [APIO2012]派遣
题目背景 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿. 题目描述 在这个帮派里,有一名忍者被称之为Master.除了Master以外,每名忍者都有且仅有一个上级.为保密 ...