学习目标:
- 242.有效的字母异位词
- 349. 两个数组的交集
- 202. 快乐数
- 1. 两数之和
解题记录:
242.有效的字母异位词
哈希解法
class Solution {
public boolean isAnagram(String s, String t) {
//字典解法
int[] hash = new int[26];
for(int i = 0; i < s.length(); i++) {
hash[s.charAt(i) - 'a']++;// 并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
}
for(int j = 0; j < t.length(); j++) {
hash[t.charAt(j) - 'a']--;
}
for(int len = 0; len < 26; len++) {
if(hash[len] != 0) {// 数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
return false;
}
}
return true;
}
}
349. 两个数组的交集
哈希解法:使用数组
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
//哈希解法,使用数组
int[] records = new int[1001];
Set<Integer> results = new HashSet<>();//结果放到Set集合中去重
for(int i = 0; i < nums1.length; i++) {
records[nums1[i]] = 1;
}
for(int i = 0; i < nums2.length; i++) {
if(records[nums2[i]] == 1) {// 判断元素是否出现过
results.add(nums2[i]);// 出现过则放入results集合中
}
}
//集合Set转成int数组返回
return results.stream().mapToInt(x -> x).toArray();
}
}
哈希解法:使用Set
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
//哈希解法,使用Set集合
Set<Integer> set1 = new HashSet<>();
Set<Integer> results = new HashSet<>();//结果放到Set集合中去重
for(int i = 0; i < nums1.length; i++) {
set1.add(nums1[i]);
}
for(int i : nums2) {
if(set1.contains(i)) {// 判断元素是否出现过
results.add(i);// 出现过则放入results集合中
}
}
//方法一:集合Set转成int数组返回
//return results.stream().mapToInt(x -> x).toArray();
//方法二:另外申请一个数组存放setRes中的元素,最后返回数组
int[] arr = new int[results.size()];
int j = 0;
for(Integer i : results) {
arr[j++] = i;
}
return arr;
}
}
202. 快乐数
哈希法
class Solution {
public boolean isHappy(int n) {
//哈希法
Set<Integer> records = new HashSet<>();
while(n != 1 && !records.contains(n)) {
records.add(n);
n = getNextNumber(n);
}
return n == 1;
}
private int getNextNumber(int n) {
int res = 0;
// 取数值各个位上的单数之和
while(n > 0) {
int temp = n % 10;
res += temp * temp;
n = n / 10;
}
return res;
}
}
1. 两数之和
class Solution {
public int[] twoSum(int[] nums, int target) {
//哈希法
Map<Integer, Integer> map = new HashMap<>();
int[] results = new int[2];
int temp = 0;
for(int i = 0; i < nums.length; i++) {
temp = target - nums[i];// 遍历当前元素,并在map中寻找是否有匹配的key
if(map.containsKey(temp)) {
results[0] = map.get(temp);
results[1] = i;
return results;
}
map.put(nums[i], i);// 如果没找到匹配对,就把访问过的元素和下标加入到map中
}
return null;//题目说只会对应一种答案,实际不会到这
}
}
学习产出:
- 242.有效的字母异位词
- 349. 两个数组的交集
- 202. 快乐数
- 1. 两数之和