day06 | 有效的字母异位词、两个数组的交集、快乐数、两数之和

有效的字母异位词

题目链接:242. 有效的字母异位词

---给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

思路:由于s和t都是由26个小写字母构成,数量很少,直接定义一个26空间的数组即可

数组下标:表示每个字母,0-'a',1-'b'...等

每个下标对应的数字:表示s字符串和t字符串中某字母出现的次数之差

若数组中的数字都是0,则为true;否则,返回false;

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] arrs = new int[26];
        for(char ch : s.toCharArray())
            arrs[ch - 'a']++;
        for(char ch : t.toCharArray())
            arrs[ch - 'a']--;
        for(int num : arrs)
            if(num != 0)return false;
        return true;
    }
}

两个数组的交集

题目链接:349. 两个数组的交集

---给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

思路:本题要求输出结果每个元素是唯一的,明显需要有去重操作,所以可以定义两个set来解决。

set1:用于保存nums1数组中的唯一元素

set2:用于保存nums1和nums2两数组交集的唯一元素

class Solution {
    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) 
            if (set1.contains(num)) 
                set2.add(num);
        
        int [] result = new int[set2.size()];
        int index = 0;
        for (int num : set2) {
            result[index++] = num;
        }
        return result;
    }
}

其实本题也可以用一个数组和一个set来完成,用时更短!!

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set = new HashSet<>();
        int[] arr = new int[1001];
        //将nums1出现的数字赋值为1,相当于另类的去重了
        for(int num : nums1)
            arr[num] = 1;

        for(int num : nums2)
            if(arr[num] != 0)//表示num是两数组的交集元素
                set.add(num);//set会自动去重
        
        // return set.stream().mapToInt(x -> x).toArray();//耗时3s,空间42.42

        int[] res = new int[set.size()];
        int index = 0;
        for(int num : set)
            res[index++] = num;
        return res;//耗时1ms,空间42.07
    }
}

快乐数

---编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

思路:题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现!!所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();
        while(!set.contains(n)){
            if(n == 1)return true;
            set.add(n);
            n = getSum(n);
        }
        return false;
    }
    public int getSum(int n){
        int num;
        int sum = 0;
        while(n != 0){
            num = n % 10;
            sum += num * num;
            n /= 10;
        }
        return sum;
    }
}

两数之和

题目链接:1. 两数之和

---给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

 思路:本题我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,所以我们需要定义一个map来解决

key:用来存放遍历的元素

value:用来存放遍历元素的下标

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map = new HashMap<>();
        for(int i = 0; i < nums.length; i++){
            //如果map中存在遍历元素所需要的“搭档”,就直接返回对应下标即可
            if(map.containsKey(target - nums[i]))return new int[]{map.get(target - nums[i]),i};
            map.put(nums[i],i);
        }
        return null;
    }
}

  • 24
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以先将年月日拼接成一个字符串,然后使用 Set 数据结构进行去重。 假设有两个数组 arr1 和 arr2,其中每个元素包含年(year)、月(month)、日(day)三个属性,可以按照如下方式进行去重: ```javascript const newArr = [...arr1, ...arr2].map(item => item.year + '-' + item.month + '-' + item.day) const uniqueArr = [...new Set(newArr)] ``` 上述代码中,首先将两个数组合并为一个新数组,然后使用 `map` 方法将每个元素拼接成一个字符串。最后,使用 `Set` 去重并将其转换为数组类型即可得到去重后的结果。 ### 回答2: 在前端中实现两个数组中的年月日去重可以通过以下步骤完成。 1. 首先创建一个新数组用于存储去重后的年月日据。 2. 将两个数组合并为一个数组。 3. 遍历合并后的数组。 4. 在遍历过程中,使用一个对象来记录已经出现过的年月日据,并以年月日作为属性进行标记。 5. 检查当前年月日是否在对象中存在,若不存在,则表示该年月日是唯一的,将其添加到新数组中,并在对象中进行标记。 6. 最后得到的新数组即为去重后的年月日据。 以下是一种实现方式的示例代码: ```javascript function deduplicateDates(arr1, arr2) { let combinedArray = [...arr1, ...arr2]; let uniqueDates = []; let dateRecord = {}; combinedArray.forEach((date) => { let yearMonthDay = date.split('-').slice(0, 3).join('-'); // 假设日期格式为YYYY-MM-DD if (!dateRecord[yearMonthDay]) { uniqueDates.push(date); dateRecord[yearMonthDay] = true; } }); return uniqueDates; } let arr1 = ['2021-01-01', '2021-02-03', '2021-03-05']; let arr2 = ['2021-01-03', '2021-02-03', '2021-04-01']; let result = deduplicateDates(arr1, arr2); console.log(result); // ['2021-01-01', '2021-02-03', '2021-03-05', '2021-01-03', '2021-04-01'] ``` 以上示例代码中,通过遍历合并后的数组,并使用一个对象 `dateRecord` 记录已经出现过的日期据,实现了两个数组中的年月日去重的功能。 ### 回答3: 要实现两个数组中的年月日去重,可以采取以下步骤: 1. 将两个数组合并成一个新的数组,可以使用数组的concat()方法实现,例如:newArray = array1.concat(array2)。 2. 创建一个空的对象,用于存储去重后的年月日信息,例如:var uniqueDates = {}。 3. 遍历新数组中的每个元素,可以使用数组的forEach()方法实现。 4. 对于每个元素,提取其中的年月日信息,可以使用日期对象的getFullYear()、getMonth()和getDate()方法。 5. 将提取出的年月日信息拼接成一个字符串作为键,判断该键是否已经存在于uniqueDates对象中。如果不存在,则将该键添加到uniqueDates对象,并将对应的值设置为true,表示已经出现过。如果存在,则说明该年月日已经被记录过,无需重复记录。 6. 完成遍历后,uniqueDates对象中存储的键就是去重后的年月日信息。可以使用Object.keys()方法将键提取成一个数组。 7. 根据需求,可以将得到的数组进行排序、格式化等操作。 8. 最后得到的数组就是两个数组中去重后的年月日信息。 需要注意的是,此方法适用于两个数组的年月日去重,如果是多个数组,可以采取类似的思路进行处理。并且,如果数组中的元素不是日期类型,需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值