代码随想录算法训练营第六天| 242.有效的字母异位词,349. 两个数组的交集 ,202. 快乐数 1. 两数之和

文章介绍了几个使用哈希技巧解决编程问题的例子,包括判断两个字符串是否为变位词(isAnagram),找出两个数组的交集(intersection)以及寻找两个数之和等于目标值的数字对(twoSum)。通过哈希表或数组,可以高效地进行查找和匹配操作,达到O(n)的时间复杂度和O(1)的空间复杂度。
摘要由CSDN通过智能技术生成

242: 主要学习到如果不用记住ascii就直接在hash[]中定位到合适的位置。这个是数组hash,感觉就是用array储存。

时间复杂度: O(n),空间复杂度: O(1)

Code:

class Solution {
    public boolean isAnagram(String s, String t) {
        int[] hash = new int[26];
        for(int i=0; i<s.length(); i++){
            hash[s.charAt(i) - 'a']++;
        }
        for(int j=0; j<t.length(); j++){
            hash[t.charAt(j) - 'a']--;
        }
        for(int k=0; k<26; k++){
            if(hash[k] != 0){
                return false;
            }
        }
        return true;
    }
}

349:

Hashset 思路:建立两个hashset:set1,set2。然后把nums1和num2的数字分别放进去,然后去看set2里面有没有contain set1的数字,有的话就加进finalist。然后最后把finalist这个hashset转换成array。

code:

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set1 = new HashSet<>();
        for(int i:nums1){
            set1.add(i);
        }

        Set<Integer> set2 = new HashSet<>();
        for(int i:nums2){
            set2.add(i);
        }

        Set<Integer> finalset = new HashSet<>();
        for(int i:set1){
            if(set2.contains(i)){
                finalset.add(i);
            }
        }
        int[] result = new int[finalset.size()];
        int index = 0;
        for(int i : finalset){
            result[index] = i;
            index++; 
        }
        return result;
    }
}

数组思路:直接建一个数组,把有nums1的位置都变成1。然后在nums2里面找,如果位置已经有1,就变成2。最后循环hash,如果hash[i]==2,那就证明有重复,加入result。

Code:

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        int[] hash = new int[1001];
        int count = 0;
        for(int i=0; i<nums1.length; i++){
            hash[nums1[i]] = 1;
        }
        for(int i=0; i<nums2.length; i++){
            if(hash[nums2[i]] == 1){
                hash[nums2[i]] = 2;
                count++;
            }
        }

        int[] result = new int[count];
        int pos = 0;
        for(int i=0; i<hash.length; i++){
            if(hash[i] == 2){
                result[pos] = i;
                pos++;
            }
        }
        return result;

    }
}

202

思路主要为查找有没有同样的sum,如果有的话,就跳不出那个循环。重要的点是要定义一个新的method,去找下一个number,而这里return的是这个数的digit平方后的数。

Code:

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> sum = new HashSet<>();
        while(n!=1 &&!sum.contains(n)){
            sum.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;
    }
}

1

主要学会如何使用Hashmap,先取一个数,然后在hashmap里面找有没有target减去那个数的值,如果有,直接填进result。如果没有,就把数加入hashmap,然后用后面的数继续去搜素。

Code:

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] result = new int[2];
        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        for(int i=0; i<nums.length; i++){
            int difference = target-nums[i];
            if(map.containsKey(difference)){
                result[1] = i;
                result[0] = map.get(difference);
                break;
            }else{
                map.put(nums[i],i);
            }
        }
        return result;
        
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值