一、500. Keyboard Row

给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。
输入: ["Hello", "Alaska", "Dad", "Peace"]
输出: ["Alaska", "Dad"]
可以重复使用键盘上同一字符。
可以假设输入的字符串将只包含字母。

  思路:将键盘上每一行的字母映射到所在的行数,如果单词的所有字母中存在和第一个单词所在的行数不相同的字母,则这个单词将不是符合需求的单词。

  需要注意的地方:

  1.whichRow = -1;以及 if (whichRow != -1) list.add(s);这种表示,可以少使用一个boolean类型的标识位,同样可以实现效果。

  2.List<String> list = new ArrayList<>();以及return list.toArray(new String[0]);的表达,由于collection.toArray(T[] a)方法转换过来是Object类型的数组,使用new String[0]可以在转换之前提前说明转换之后的类型,就是开辟了一块长度为0的内存用来做标记的作用。

    public String[] findWords(String[] words) {
String[] rows = {"qwertyuiop", "asdfghjkl", "zxcvbnm"};
Map<Character, Integer> map = new HashMap<>();
for (int i = 0; i < rows.length; i++) {
for (char c : rows[i].toCharArray()) {
map.put(c, i);
}
}
List<String> list = new ArrayList<>();
for (String s : words) {
int whichRow = map.get(s.toLowerCase().charAt(0));
for (int i = 1; i < s.length(); i++) {
if (map.get(s.toLowerCase().charAt(i)) != whichRow) {
whichRow = -1;
break;
}
}
if (whichRow != -1) list.add(s);
}
return list.toArray(new String[0]);
}

  二、690. Employee Importance

给定一个保存员工信息的数据结构,它包含了员工唯一的id,重要度 和 直系下属的id。
比如,员工1是员工2的领导,员工2是员工3的领导。
他们相应的重要度为15, 10, 5。那么员工1的数据结构是[1, 15, [2]],员工2的数据结构是[2, 10, [3]],员工3的数据结构是[3, 5, []]。
注意虽然员工3也是员工1的一个下属,但是由于并不是直系下属,因此没有体现在员工1的数据结构中。
现在输入一个公司的所有员工信息,以及单个员工id,返回这个员工和他所有下属的重要度之和。
输入: [[1, 5, [2, 3]], [2, 3, []], [3, 3, []]], 1
输出: 11
员工1自身的重要度是5,他有两个直系下属2和3,而且2和3的重要度均为3。因此员工1的总重要度是 5 + 3 + 3 = 11。
一个员工最多有一个直系领导,但是可以有多个直系下属。员工数量不超过2000。

  1.类似于[[1, 5, [2, 3]], [2, 3, []], [3, 3, []]], 1这种情况,可以使用下面的代码,只计算了当前的员工和其直系下属的重要值之和。

    public int getImportance(List<Employee> employees, int id) {
int res = 0;
int boss = -1;
for (int i = 0; i < employees.size(); i++) {
if (employees.get(i).id == id) {
boss = i;
res += employees.get(i).importance;
}
}
if (boss == -1) return 0;
for (int i = 0; i < employees.size(); i++) {
if (employees.get(boss).subordinates.contains(employees.get(i).id)) {
res += employees.get(i).importance;
}
}
return res;
}

  而如果是[[1, 5, [2, 3]],[2, 3, [4]],,[3, 3, []], 4,1,[]], 1这种情况就无法计算了。但是如果画图来看,它就是一个二叉树,因此考虑深度优先遍历。(DFS)

  2.思路:使用Map:e.id -> e,然后再使用DFS遍历即可。

  需要注意的地方:使用Map是为了在DFS的时候可以很方便地用id来表示对象,注意DFS的表达ans += dfs(subid);

    private Map<Integer, Employee> map;

    public int getImportance(List<Employee> employees, int id) {
map = new HashMap<>();
for (Employee employee : employees) map.put(employee.id, employee);
return dfs(id);
} private int dfs(int id) {
Employee employee = map.get(id);
int ans = employee.importance;
for (Integer subid : employee.subordinates) {
ans += dfs(subid);
}
return ans;
}

  三、447. Number of Boomerangs

给定平面上 n 对不同的点,“回旋镖” 是由点表示的元组 (i, j, k) ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序)。
输入:
[[0,0],[1,0],[2,0]]
输出:
2
两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]

  1.思路:首先使用暴力法遍历出每一个点到除了它本身的其他点的距离,例如,假设遍历到了[0,0]这个点,对于其他每个点到[0,0]的距离做为key,出现的次数作为value,也就是说,如果[0,0]对应的map为{1=1,2=3,3=4},就说明到[0,0]的距离为1的点有1个,为2的点有2个,为3的点有4个,那么表示回旋镖的时候,[0,0]为第一个,剩下两个数排列,即A21 + A22 + A32 = 1*0 + 2*1+3*2=8;

  2.代码(时间复杂度N^2,空间复杂度N):需要注意的表达是:for (int value : map.values()) count += value * (value-1);和 map.clear();,前者不用通过map.keyset()来遍历,这样可以更加快捷,直接使用map里面的value也可以满足想要的需求;后者每次clear可以再次重复使用,这样只需要新建一个Map对象就可以重复使用。

    public int numberOfBoomerangs(int[][] points) {
int count = 0;
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < points.length; i++) {
for (int j = 0; j < points.length; j++) {
if (i == j) continue;
int d = getDistance(points[i], points[j]);
map.put(d, map.getOrDefault(d, 0)+1);
}
for (int value : map.values()) count += value * (value-1);
map.clear();
}
return count;
} private int getDistance(int[] a, int[] b) {
int dx = a[0] - b[0];
int dy = a[1] - b[1];
return dx*dx + dy*dy;
}

  四、720. Longest Word in Dictionary(TODO)

输入:
words = ["w","wo","wor","worl", "world"]
输出: "world"
解释:
单词"world"可由"w", "wo", "wor", 和 "worl"添加一个字母组成。 输入:
words = ["a", "banana", "app", "appl", "ap", "apply", "apple"]
输出: "apple"
解释:
"apply"和"apple"都能由词典中的单词组成。但是"apple"得字典序小于"apply"。

  1.思路:(1)Brute Force (2)Trie + DFS

  2.代码:

  五、438. Find All Anagrams in a String

输入:
s: "cbaebabacd" p: "abc"
输出:
[0, 6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的字母异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的字母异位词。 输入:
s: "abab" p: "ab"
输出:
[0, 1, 2]
起始索引等于 0 的子串是 "ab", 它是 "ab" 的字母异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的字母异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的字母异位词。

  1.思路:(1)Brute Force[Time Limit Exceeded]  (2)Sliding Window(TODO)

  2.代码:

  (1)Brute Force[Time Limit Exceeded]

    public List<Integer> findAnagrams(String s, String p) {
List<Integer> list = new ArrayList<>();
Map<Character, Integer> map = new HashMap<>();
for (char c : p.toCharArray()) map.put(c, map.getOrDefault(c, 0)+1);
Map<Character, Integer> tmp = new HashMap<>();
for (int i = 0; i <= s.length() - p.length(); i++) {
for (int j = i; j < i + p.length(); j++) {
tmp.put(s.charAt(j), tmp.getOrDefault(s.charAt(j), 0)+1);
}
if (tmp.equals(map)) list.add(i);
tmp.clear();
}
return list;
}

  (2)Sliding Window

  2.代码:

  

Leetcode Tags(5)Hash Table的更多相关文章

  1. PHP内核探索之变量(3)- hash table

    在PHP中,除了zval, 另一个比较重要的数据结构非hash table莫属,例如我们最常见的数组,在底层便是hash table.除了数组,在线程安全(TSRM).GC.资源管理.Global变量 ...

  2. 交互设计算法基础(4) - Hash Table

    import java.util.Map; // Note the HashMap's "key" is a String and "value" is an ...

  3. Leetcode Tags(13)Bit Manipulation

    一.477.汉明距离总和 输入: , , 输出: 解释: 在二进制表示中,4表示为0100,14表示为1110,2表示为0010.(这样表示是为了体现后四位之间关系) HammingDistance( ...

  4. Leetcode Tags(13)Tree

    1.前序.中序.后序递归方式遍历二叉树 public void preOrderRecur(Node T) { if (T != null) { System.out.print(T.val + &q ...

  5. Leetcode Tags(8)Binary Search

    一.475. Heaters 输入: [1,2,3],[2] 输出: 1 解释: 仅在位置2上有一个供暖器.如果我们将加热半径设为1,那么所有房屋就都能得到供暖. 输入: [1,2,3,4],[1,4 ...

  6. Leetcode Tags(6)Math

    一.204. Count Primes Count the number of prime numbers less than a non-negative number, n. Input: 10 ...

  7. Leetcode Tags(3)String(TODO)

    一.Easy 696 Count Binary Substrings Input: "00110011" Output: 6 Explanation: There are 6 su ...

  8. Leetcode Tags(2)Array

    一.448. Find All Numbers Disappeared in an Array 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了 ...

  9. Leetcode Tags(1)Linked List

    1.知识点回顾 https://www.cnblogs.com/BigJunOba/p/9174206.html https://www.cnblogs.com/BigJunOba/p/9174217 ...

随机推荐

  1. 第八届蓝桥杯java b组第十题

    标题: k倍区间 给定一个长度为N的数列,A1, A2, ... AN,如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍 ...

  2. WebApi简介

    简单创建.NET Core WebApi:https://www.cnblogs.com/yanbigfeg/p/9197375.html 登陆验证四种方式:https://www.cnblogs.c ...

  3. Atm 测试

    Account.java package ATM;//信1705-1 20173628 赵路仓 public class Account { private int balance;//余额 priv ...

  4. 在Debian上用FVWM做自己的桌面

    用FVWM做自己的桌面 Table of Contents 1. 前言 2. 学习步骤 3. 准备 3.1. 软件包 3.2. 字体 3.3. 图片 3.4. 参考资料 4. 环境 5. 布局 6. ...

  5. linux mint安装ffmpge

    sudo add-apt-repository ppa:mc3man/trusty-media sudo apt-get update sudo apt-get install ffmpeg

  6. Julia初学备忘

    println("hello!") println("hello!") print("hello!") print("hello! ...

  7. 前端深入之css篇|link和@import到底有什么区别?

    写在前面 在真正的前端开发中,我们很少去写行内样式和内嵌样式,通常都是去引用外部样式. 而在我们学习之初的外部样式表都是用link引入的,但是当后来我们学习的逐渐深入,发现@import也可以引入样式 ...

  8. 软件开发工具(第9章:使用Eclipse进行C/C++开发)

    一.安装MinGW MinGW是指用来生成可执行文件的编译环境,它是开发C/C++项目 的工具集.为了能够使用Eclipse CDT编译且运行C和C++程序,必须 要安装一个C/C++编译器. 下载: ...

  9. ELK日志分析系统(4)-elasticsearch数据存储

    1. 概述 logstash把格式化的数据发送到elasticsearch以后,elasticsearch负责存储搜索日志数据 elasticsearch的搜索接口还是很强大的,这边不详细展开,因为k ...

  10. JS基本数据类型和引用数据类型的区别及深浅拷贝

    前言 首先我们先来了解一下什么叫栈堆,基本数据类型与引用数据类型 1.栈(stack)和堆(heap)stack为自动分配的内存空间,它由系统自动释放:而heap则是动态分配的内存,大小也不一定会自动 ...