给定两个字符串 s
和 t
,编写一个函数来判断 t
是否是 s
的字母异位词。
注意:若 s
和 t
中每个字符出现的次数都相同,则称 s
和 t
互为字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
提示:
1 <= s.length, t.length <= 5 * 104
s
和t
仅包含小写字母
思路:
此题题意很简单,就是让我们找出两个字符串的各个小写字母个数是否相等,那么我们只要统计出两个字符串中每个字符出现的数量就可以对比得出答案了,而字母只有26个,很容易想到用一个int类型的哈希数组去保存这些字母出现的次数,而用其下标作为各个字母的索引,对比后的出最后了结果。
当然,我们其实也不用创建出两个数组去存放结果,只需要当字符串s中出现一个字母就在对应下标+1,字符串t中出现一个字母就在对应下标-1,最后判断数组数值是不是全为0就可以了,下面是代码演示
public boolean isAnagram(String s, String t) {
if(s.length() != t.length()){
return false;
}
//创建一个哈希表统计每个字母出现的频率
//默认的初始值为0
int[] letter = new int[26];
for (int i = 0; i < s.length(); i++) {
letter[s.charAt(i)-'a']++;
letter[t.charAt(i)-'a']--;
}
for(int i =0;i<26;i++){
if(letter[i] != 0){
return false;
}
}
return true;
}
给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 解释:[4,9] 也是可通过的
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
思路:
题目中可以看到,最后的返回结果是去重的,而理清下思路想一想解题过程的话,会发现解题的过程也是要求去重的,那么在元素中不会存在重复元素的数据结构是谁?就是Set。
在我们选用Set进行解题后,第一步要做的也就是要去重,只要把nums1中的元素一一添加进入nums1_Set中就能够自动完成这一步,随后使用nums2的数据在nums1_Set中检索就可以了,存在则把当前你的数据添加进去结果集result_Set,去重的工作也在Set中自动完成了,最后将result_Set转化为数组输出便可以了
下面是代码实现:
public static int[] intersection(int[] nums1, int[] nums2) {
//定义一个set,存放num1中的元素
Set set = new HashSet();
Set resSet = new HashSet();//存放最后结果
for(int i : nums1){
set.add(i);
}
//对数组2的元素进行遍历,看是否有存在set的元素
for(int i :nums2){
if(set.contains(i)){
resSet.add(i);
}
}
//讲resSet中的元素转化为数组
int[] result = new int[resSet.size()];
int k =0;
for(Object i :resSet){
result[k] = (int)i;
k++;
}
return result;
}
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
示例 1:
输入:n = 19 输出:true 解释: 12 + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1
思路:
看到题中的无限循环我们应该想,应该用什么样的条件去结束循环返回结果呢,当然是要结合着题目去看,我们发现快乐数的结果出现相同时,代码便会依照题目的条件无限循环下去,那么只要将出现过的结果放入set中,然后检测结果是否放置成功即可,无限循环的情况一定会有重复的结果,当Set添加不了的时候便会返回一个false的结果,可以利用这一点结束循环
代码实现如下
public static boolean isHappy(int n) {
Set<Integer> set = new HashSet<Integer>();
int sum = n;
int temp = n;
int lastNum;
//退出循环则说明添加了重复的数,再进行计算会进入一个循环
while(set.add(sum)){
temp = sum;
sum =0;
//求出每个位数的值再平方相加
while(temp !=0){
lastNum = temp%10;
sum += Math.pow(lastNum,2);
temp /= 10;
}
System.out.println(sum);
if(sum == 1){
return true;
}
}
return false;
}
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6 输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6 输出:[0,1]
相信大家在力扣上写的第一道题就是这个,那时候我们会用两层for循环暴力解题,使用时间击败0.1%的扣友,而我们学习了哈希表后再来解决这一题,就可以写出一个更优的方案了。
思路:
使用HashMap数据结构,遍历nums数组,查询target - nums[i]这个元素是否在Map中,
不存在则将当前遍历元素添加进Map,然后遍历下一个元素
注意KEY最好为数值,VAL最好为元素的下标,因为要查找的是数值而不是下标
下面是代码实现
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
int[] result = new int[2];
for(int i =0;i<nums.length;i++){
if(map.containsKey(target-nums[i])){
result[0] = i;
result[1] = map.get(target-nums[i]);
}
map.put(nums[i],i);
}
return result;
}
今天力扣解题总结就到这里,感谢大家的观看!