1.有效的字母异位词
//给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 // // 示例 1: // // 输入: s = "anagram", t = "nagaram" //输出: true // // // 示例 2: // // 输入: s = "rat", t = "car" //输出: false // // 说明: //你可以假设字符串只包含小写字母。 // // 进阶: //如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况? // Related Topics 排序 哈希表
这个建议直接用排序之后再看是否相等来做,简单。还有一种hash表的方式,比较复杂,而且也没有很大的必要性
public boolean isAnagram(String s, String t) {
if (s.length() != t.length()) {
return false;
}
char[] str1 = s.toCharArray();
char[] str2 = t.toCharArray();
Arrays.sort(str1);
Arrays.sort(str2);
return Arrays.equals(str1, str2);
}
2.两个数组的集合
//给定两个数组,编写一个函数来计算它们的交集。 // // // // 示例 1: // // 输入:nums1 = [1,2,2,1], nums2 = [2,2] //输出:[2] // // // 示例 2: // // 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] //输出:[9,4] // // // // 说明: // // // 输出结果中的每个元素一定是唯一的。 // 我们可以不考虑输出结果的顺序。 // // Related Topics 排序 哈希表 双指针 二分查找
方法一:采用集合的方式,将数组转成Set类型的集合,这样可以去掉数组中的重复元素,然后遍历短的那个数组,用contains函数来确认。
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set1 = new HashSet<>();
Set<Integer> set2 = new HashSet<>();
for (int num: nums1) {
set1.add(num);
}
for (int num : nums2){
set2.add(num);
}
return getIntersection(set1, set2);
}
public int[] getIntersection(Set<Integer> set1, Set<Integer> set2){
if (set1.size() > set2.size()) {
return getIntersection(set2, set1);
}
Set<Integer> intersectionSet = new HashSet<Integer>();
for (int num : set1) {
if (set2.contains(num)) {
intersectionSet.add(num);
}
}
int[] intersection = new int[intersectionSet.size()];
int index = 0;
for (int num : intersectionSet) {
intersection[index++] = num;
}
return intersection;
}
这里顺便复习一下,set集合是无法直接向list一样通过get函数来取值的,只能通过迭代器来做,具体方式如下:
Set<Object> set = new HashSet<Object>();
Iterator<Object> it = set.iterator();
while(it.hasNext())//判断bai是否du有下一个
it.next()//取出元素。
方法二:排序+双指针。
由小到大进行排序,然后两个指针逐个推进,如果相等,那么两个指针分别加1,如果不等,小的那个加一。这里还有一点就是确保没有重复的元素,不要放在两个数组来确定,而是放在被赋值的数组里来判断,即判断两个数组中元素相等时,在赋值之间还需判断这个元素与这个数组之前的元素是否相等,如果相等,那就不赋值。
public int[] intersection(int[] nums1, int[] nums2) {
Arrays.sort(nums1);
Arrays.sort(nums2);
int length1 = nums1.length, length2 = nums2.length;
int[] intersection = new int[length1 + length2];
int index = 0, index1 = 0, index2 = 0;
while(index1 < length1 && index2 < length2){
if(nums1[index1] == nums2[index2]){
if(index == 0 || intersection[index-1] != nums1[index1]){
intersection[index++] = nums1[index1];
}
index1++;
index2++;
}else if(nums1[index1] < nums2[index2]){
index1++;
}else{
index2++;
}
}
return Arrays.copyOfRange(intersection, 0, index);
}