题目描述:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1: 输入: s = "anagram", t = "nagaram" 输出: true
示例 2: 输入: s = "rat", t = "car" 输出: false
说明: 你可以假设字符串只包含小写字母。
解题思路:
①因为s和t中包含的字母都是小写字母,所有新建一个长度为26的数组用来记录两个字符串中字母出现的次数。
②分别对s和t进行for循环,首先对于字符串s,对字符串中每个字母进行一次for循环,将每个字母对应record数组中的位置,并使其加一,此时,我们可以用字母减去'a'所得的相对位置来记录。字符串s遍历结束后,对字符串t来遍历,每出现一个字母对字符串内的相应位置进行减一操作。
③遍历record数组,若数组中每个位置的元素均为0,则s和t互为字母异位词,返回true,否则,返回false.
class Solution {
public boolean isAnagram(String s, String t) {
int []record = new int[26];
for(char c : s.toCharArray()){
record[c - 'a'] += 1;
}
for(char c : t.toCharArray()){
record[c - 'a'] -= 1;
}
for(int i = 0;i < 26;i++){
if(record[i] != 0){
return false;
}
}
return true;
}
}
题意:给定两个数组,编写一个函数来计算它们的交集。
说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序
解题思路:
①首先判断数组nums1和nums2是否长度为0或者为空,如果是 ,则返回一个长度为0的新建的数组;
②新建一个集合set1,将nums1数组中包含的元素全部放在集合set1中,然后遍历nums2,判断nums2中是否有和nums1中相同的元素,如果有,添加到新建的集合resSet中。
③新建一个数组,将resSet中的数组(也就是两个数组中相同的元素)重新添加到新的数组中,返回新的数组。
import java.util.HashSet;
import java.util.Set;
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
if(nums1 == null || nums1.length == 0 || nums2 == null||nums2.length == 0){
return new int[0];
}
Set<Integer> set1 = new HashSet<>();
Set<Integer> resSet = new HashSet<>();
for(int i :nums1){
set1.add(i);
}
for(int i :nums2){
if(set1.contains(i)){
resSet.add(i);
}
}
int[] resArr = new int[resSet.size()];
int index = 0;
for(int i :resSet){
resArr[index++] = i;
}
return resArr;
}
}
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 True ;不是,则返回 False 。
示例:
输入:19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。
解题思路:
新建一个集合,用来存放每次计算过程中的求出的和,判断集合中是否存在相同的和,如果重复了,则return false,否则,继续循环直到n == 1
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 res = 0;
while(n>0){
int temp = n % 10;
res += temp * temp;
n = n / 10;
}
return res;
}
}