Day6|242.有效的字母异位词, 349. 两个数组的交集, 202. 快乐数 , 1. 两数之和

本文概述了几种编程题目,如检查字符串是否为字母异位词、求两个数组的交集、判断快乐数以及寻找两数之和,展示了使用Java中哈希表、set和数组操作的有效解决方案。
摘要由CSDN通过智能技术生成

242.有效的字母异位词代码随想录

用减法运算把字符映射成index,在该char对应的index处记录其总共出现的次数

细节,java里字符串对象的length()是方法故加(),数组的length是成员变量,不用()

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

 349. 两个数组的交集代码随想录

遍历nums1,存入set,遍历nums2时检测是否在set里出现过,出现过就存入resSet,

for each在完全遍历数组集合时很方便

法1 用set

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> numsSet = new HashSet<>();
        Set<Integer> resSet = new HashSet<>();
        for(int num : nums1){//for(int i = 0; i < t.length; i++)
            numsSet.add(num);
        }
        for(int num : nums2){
            if(numsSet.contains(num)){//contains(Object);
                resSet.add(num);
            }
        }
        return resSet.stream().mapToInt(Integer :: intValue).toArray();//stream()
    }
}

法2用数组

用两个recordhash数组记录有没有出现,出现翻值为1,当两个recordhash同时为1时加入动态数组

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        int[] hash = new int[1001];
        int[] hash2 = new int[1001];
        for(int num : nums1){
            hash[num] = 1;
        }
        for(int num : nums2){
            hash2[num] = 1;
        }
        List<Integer> resList = new ArrayList<>();
        for(int i = 0; i < 1001; i++){
            if(hash[i] == 1 && hash2[i] == 1){
                resList.add(i);
            }
        }
        return resList.stream().mapToInt(Integer :: intValue).toArray();
    }
}

 202. 快乐数 代码随想录

对于一个多位数其得快乐数不可能是无限递增

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> record = new HashSet<>();
       while(true){
           record.add(n);
           n = getSum(n);//这两条顺序很重要,加完原始值再更新n,如果添加x后直接上判断语句则始终return fasle
           if(n == 1){
               return true;
           }else if(record.contains(n)){
               return false;
           }
       }
    }
     int getSum(int n){
         int res = 0;
            while(n != 0){
                int temp = n % 10;
                res = temp * temp + res;//这种快乐数在3位数以上后快乐计算后数值变小,不会单调增增到无要么出现循环重复数字要么跌到1
                n = n / 10;
            }
            return res;
        }
}

 1. 两数之和 代码随想录

循环时寻找target与cur的差之前有没有出现过,要用map存遍历过的数值及其对应标号。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer , Integer> map = new HashMap<>();
        int i = 0;
        int[] res = new int[2];
        for(int num : nums){//也可用i < length循环
            int s = target - num;
            if(map.containsKey(s)){
                res[0] = map.get(s);
                res[1] = i;
                return res;
            }
            map.put(num , i);
            i++;
        }
        return res;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值