242.有效的字母异位词
题目描述:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词(异位词指的是两个单词里面的字母都要一致)。
思路:
- 遍历第一个字符串,用map来记录字母及其出现的次数
- 遍历第二个字符串,出现一致的,value就减一
- 技巧:由于是字母,最多只有26个,可以直接用数组来当map来使用
class Solution {
public boolean isAnagram(String s, String t) {
// 和字母有关系 直接用数组来当map
int[] map = new int[26];
for(int i = 0;i < s.length();i++){
char tmp = s.charAt(i);
map[tmp - 'a']++;
}
for(int i = 0;i < t.length();i++){
char tmp = t.charAt(i);
map[tmp - 'a']--;
}
for(int i = 0;i < map.length;i++){
if(map[i] != 0){
return false;
}
}
return true;
}
}
349.两个数组的交集
题目描述:给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
思路:
- 返回交集,由于不能重复返回,所以用一下map来记录值
- 观察到值的大小在1000以内,所以还可以使用数组来作为map
- 当然用set也可以,但是最后的return要求是返回数组,那么如何遍历set?
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
// 判断是否可以使用数组来当hash表,主要看题目给的范围,这里数组的范围是1000,可以使用
int[] map = new int[1001];
List<Integer> list = new LinkedList<>();
for(int i = 0;i < nums1.length;i++){
if(map[nums1[i]] == 0){
map[nums1[i]]++;
}
}
for(int i = 0;i < nums2.length;i++){
if(map[nums2[i]] == 1){
list.add(nums2[i]);
map[nums2[i]] = 0;
}
}
int[] res = new int[list.size()];
for(int i = 0;i < list.size();i++){
res[i] = list.get(i);
}
return res;
}
}
202.快乐数
题目描述:编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
思路:
- 题目的关键是如何处理最后的无限循环?或者我们什么时候可以认为它是无限循环的,然后可以退出?
- 当同一平方出现两次的时候,他们就一定会循环下去,所以就直接false。所以使用set来记录是否重复
class Solution {
public boolean isHappy(int n) {
// 开始没思路,不知道如何处理无限循环
// 可以使用一个hash表来进行处理,如果一个结果出现了第二次,肯定就是不行的
HashSet<Integer> set = new HashSet<>();
int sum = n;
while(sum != 1){
sum = getNext(sum);
if(set.contains(sum)){
return false;
}else{
set.add(sum);
}
}
return true;
}
public int getNext(int n){
int sum = 0;
while(n != 0){
int tmp = n%10;
n = n/10;
sum += tmp * tmp;
}
return sum;
}
}
1. 两数之和
题目描述:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
思路:
- 需要一个集合来存放我们遍历过的元素,然后在遍历数组的时候去询问这个集合,某元素是否遍历过,也就是 是否出现在这个集合
- 为什么要用map?这里要求返回的是数组下标,所以需要用map来存一下下标的值
class Solution {
public int[] twoSum(int[] nums, int target) {
// 一定会存在一个有效答案
// 暴力直接两遍循环
// 使用hash表来记录,用空间来换时间
// 这里由于要返回索引值,所以要用map来记录,<key,value> = <值,索引>
int[] res = new int[2];
HashMap<Integer,Integer> map = new HashMap<>();
for(int i = 0;i < nums.length;i++){
int need = target - nums[i];
if(map.containsKey(need)){
res[0] = map.get(need);
res[1] = i;
}else{
map.put(nums[i],i);
}
}
return res;
}
}