LeetCode30--有效的字母异位词和两个数组的集合

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);
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值