代码随想录算法训练营第六天| 242.有效的字母异位词 349. 两个数组的交集 第202题. 快乐数 1.两数之和
242.有效的字母异位词
字母是否出现过:哈希法
常犯错误 : 包装类的方法后面都要跟括号 eg : s.length()
字符串 s , 不能使用 s[i] , 要使用 s.charAt(i)
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']++;
}
for(int i = 0; i < t.length(); i++){
hash[t.charAt(i) - 'a']--;
}
for(int i = 0; i < 26; i++){
if(hash[i] != 0){
return false;
}
}
return true;
}
}
349. 两个数组的交集
数字是否出现过:哈希法
- 严格判空 : nums1 == null 数组对象不存在 , nums1.length == 0 数组对象存在但为空
if(nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0)
- 声明语句 : Set
set1 = new HashSet<>();
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
//HashSet方法
if(nums1 == null ||nums1 .length == 0 || nums2 == null || nums2.length == 0){
return new int[0];
}
Set<Integer> set1 = new HashSet<>();
Set<Integer> relset = new HashSet<>();
for(int i : nums1){
set1.add(i);
}
for(int i : nums2){
if(set1.contains(i)){
relset.add(i);
}
}
int[] result = new int[relset.size()];
int j = 0;
for(int i : relset){
result[j++] = i;
}
return result;
}
}
哈希数组方法
重点 : 如何去重 同时比较两个数组某个值是否都大于0
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
//数组方法
int[] hash1 = new int[1002];
int[] hash2 = new int[1002];
for(int i : nums1){
hash1[i]++;
}
for(int i : nums2){
hash2[i]++;
}
//去重
List<Integer> resList = new ArrayList<>();
for(int i = 0; i < 1002; i++){
if(hash1[i] > 0 && hash2[i] > 0){
resList.add(i);
}
}
int index = 0;
int res[] = new int[resList.size()];
for(int i : resList)
res[index++] = i;
return res;
}
}
第202题. 快乐数
是否是循环 : 是否出现过这个数 哈希法
-
如何取每个数,并平方后累加 :
int sum = 0; while(n > 0){ int temp = n % 10; sum += temp * temp; n = n / 10; } -
循环条件 : 因为只有两种可能性 n == 1 或一直循环
我要记录每个出现过的数, 条件就是 没出现过 且 不等于 1. 他在while中循环, 他跳出循环时, 为1则是true, 否则是false
class Solution {
public boolean isHappy(int n) {
Set<Integer> record = new HashSet<>();
while(n != 1 && !record.contains(n)){
record.add(n);
n = getNextNumber(n);
}
return n == 1;
}
private int getNextNumber(int n){
int sum = 0;
while(n > 0){
int temp = n % 10;
sum += temp * temp;
n = n / 10;
}
return sum;
}
}
1.两数之和
- 为什么用哈希? 把出现过的值都记录下来,遍历时,寻找与之相加为target的数是否出现过
- 为什么用map? 因为要查找该值是否出现过,且返回其下标 , 两个值用map键值对
- map的key存什么? 存你要找的是否存在过的值
- map的基本用法:
- 声明 : Map<Integer, Integer> map = new HashMap<>();
- 查找 : map.containsKey(temp)
- 查找对应的value : map.get(temp)
- 添加 : map.put(nums[i], i)
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] res = new int[2];
if(nums == null || nums.length == 0){
return res;
}
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
int temp = target - nums[i];
if(map.containsKey(temp)){
res[0] = i;
res[1] = map.get(temp);
break;
}
map.put(nums[i], i);
}
return res;
}
}
浙公网安备 33010602011771号