有效的字母异位词
思路
通过一个哈希表,设置长度为26,正好统计26字母,统计每个字母出现的次数,对第一个单词,先累加,对第二个单词,递减,当哈希表中所有的数字都是0,那么就表示这两个单词是字母异位词
代码
class Solution {
public boolean isAnagram(String s, String t) {
int count[] = new int[26];
for(int i = 0;i < s.length();i++){
count[s.charAt(i)-'a'] += 1;
}
for(int j = 0;j < t.length();j++){
count[t.charAt(j)-'a'] -= 1;
}
for(int i = 0;i<count.length;i++){
if(count[i]!=0){
return false;
}
}
return true;
}
}
349. 两个数组的交集
思路
思路:先给两个数组排好序,然后,创建一个数组存储不重复的元素,用双指针法在两个数组上移动
题解思路:用set不存储重复元素的特性来存储这两个素组中不重复的元素
代码:
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set1 = new HashSet<Integer>();
Set<Integer> set2 = new HashSet<Integer>();
for(int i = 0;i < nums1.length;i++){
set1.add(nums1[i]);
}
for(int i = 0;i < nums2.length;i++){
if(set1.contains(nums2[i])){
set2.add(nums2[i]);
}
}
return set2.stream().mapToInt(x->x).toArray();
}
}
快乐数
思路
解题思路:通过set判断数字的sum是否重复出现,如果sum重复出现了,那么就表示存在一个循环,此时就不是快乐数。
代码
class Solution {
public boolean isHappy(int n) {
Set<Integer> s = new HashSet<Integer>();
while(n != 1 && !s.contains(n)){
s.add(n);
n = nextNumber(n);
}
return n == 1;
}
public int nextNumber(int n){
int nextn = 0;
int x;
while(n != 0){
x= n%10;
nextn += Math.pow(x,2);
n /= 10;
}
return nextn;
}
}
两数之和
思路
先定义好一个数组result,大小为2,用来返回结果的下标。用一个map来存储下标和数字之间的映射关系,用key存储数值,value存储下标。遍历原数组,在过程中,把数字加入到map中,然后不断判断,此时的值是否能和已经在map里的值相加组成target (使用map的containsKey方法),如果可以,就添加到result并放回。
代码
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] result = new int[2]; //0 表示左边下标 1表示右下标
int temp;
Map<Integer,Integer> map = new HashMap<>();
for(int i =0; i < nums.length; i++){
temp = target - nums[i];
if(map.containsKey(temp)){
result[0] = i;
result[1] = map.get(temp);
break;
}
map.put(nums[i],i);
}
return result;
}
}