- 有效的字母异位词(亚马逊、Facebook、谷歌在半年内面试中考过)
Solution
import java.util.HashMap;
/**
* 异位词
*
* @Author: zhangwbin
* @Date: 2020/5/25
*/
public class Solution242 {
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
// 暴力求解 时间复杂度nlogn
/*char[] a = s.toCharArray();
char[] b = t.toCharArray();
Arrays.sort(a);
Arrays.sort(b);
return Arrays.equals(a, b);*/
// hash 空间复杂度O(n)时间复杂度O(n)
// 使用map保存每个字母在第一个单词中出现的次数,第二个单词通过减hashmap的value,减为0就remove,如果最终hashmap为空,说明是异位词
HashMap<Character, Integer> map = new HashMap();
char[] a = s.toCharArray();
for (int i = 0; i < s.length(); i++) {
if (map.containsKey(a[i])) {
map.put(a[i], map.get(a[i]) + 1);
} else {
map.put(a[i], 1);
}
}
char[] b = t.toCharArray();
for (int i = 0; i < t.length(); i++) {
if (map.containsKey(b[i])) {
map.put(a[i], map.get(a[i]) - 1);
} else {
return false;
}
if (map.get(a[i]) == 0) {
map.remove(a[i]);
}
}
return map.size() == 0;
}
public static void main(String[] args) {
String s = "anagram";
String t = "nagaram";
Solution242 solution242 = new Solution242();
System.out.println(solution242.isAnagram(s, t));
s = "rat";
t = "car";
System.out.println(solution242.isAnagram(s, t));
}
}
- 字母异位词分组(亚马逊在半年内面试中常考)
Solution49
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Author: zhangwbin
* @Date: 2020/5/25
*/
public class Solution49 {
public List<List<String>> groupAnagrams(String[] strs) {
// 暴力 时间复杂度Knlogn
/* if(strs == null || strs.length == 0) return new ArrayList<>();
Map<String, List<String>> map = new HashMap<>();
for (int i = 0; i< strs.length; i++) {
String str = strs[i];
char[] chars = str.toCharArray();
Arrays.sort(chars);
String key = Arrays.toString(chars);
if (map.containsKey(key)) {
map.get(key).add(str);
} else {
List<String> list = new ArrayList<>();
list.add(str);
map.put(key, list);
}
}
return new ArrayList<>(map.values());*/
// hash计数法,时间复杂度n*k
if(strs == null || strs.length == 0) return new ArrayList<>();
Map<String, List<String>> map = new HashMap<>();
for (int i = 0; i< strs.length; i++) {
String str = strs[i];
char[] chars = str.toCharArray();
int[] tmp = new int[26];
for(int j = 0; j < chars.length; j ++) {
int index = chars[j] - 'a';
tmp[index]++;
}
String key = Arrays.toString(tmp);
if (map.containsKey(key)) {
map.get(key).add(str);
} else {
List<String> list = new ArrayList<>();
list.add(str);
map.put(key, list);
}
}
return new ArrayList<>(map.values());
}
public static void main(String[] args) {
Solution49 solution49 = new Solution49();
String[] strs = new String[]{"eat", "tea", "tan", "ate", "nat", "bat"};
List<List<String>> lists = solution49.groupAnagrams(strs);
System.out.println(lists);
}
}
- 两数之和(亚马逊、字节跳动、谷歌、Facebook、苹果、微软、腾讯在半年内面试中常考)
Solution1
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* @Author: zhangwbin
* @Date: 2020/5/14
*/
public class Solution1 {
public int[] twoSum(int[] nums, int target) {
/*// 暴力求解, 时间复杂度n^2
for (int i = 0; i < nums.length - 1; i++) {
int m = nums[i];
for (int j = i + 1; j < nums.length; j++) {
int n = nums[j];
if (m + n == target) {
return new int[]{i, j};
}
}
}
return null;*/
// hash法 时间复杂度O(n),空间复杂度O(n)
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i< nums.length; i++) {
int m = target - nums[i];
if (map.containsKey(m)) {
return new int[]{map.get(m), i};
}
map.put(nums[i], i);
}
return null;
}
public static void main(String[] args) {
int[] nums = new int[]{3, 2, 4};
Solution1 solution1 = new Solution1();
int[] result = solution1.twoSum(nums, 6);
System.out.println(Arrays.toString(result));
}
}
算法练习注重一个熟练,并不是每个人都有一个聪明的大脑,拿到算法题就会做的,但是如果你不断的可以练习,大脑里就会形成自己的一套逻辑,碰见问题该怎么思考,什么类型的题目该用什么方法去解,如何去优化,等等。