代码随想录刷题day6


day5是周日,用于复习这一周的题目(实际上是在补进度hh
今天是hash表的简单题目,这个数据结构用途很广泛,我在求链表环那道题中也用到了这种数据结构。

242-有效的字母异位词

这道题是判断两个字符串中是否还有的字母种类和对应数量一致,如果是则返回true,不是则返回false。

其实题目中已经有提示了,因此可以采用26大小的数组来做,卡哥文章提到数组也是一种哈希表,确实,在我看来,数组就是一种特殊的哈希表,因为数组的地址是连续的,而哈希一般是经过某种算法得到的地址,且二者均是随机存储,即存取效率很高,直接通过地址获得。

class Solution {
    public boolean isAnagram(String s, String t) {
       // 如果记不得小a代表的数字是多少,则可以通过这种方式获得
       int offset = 'a' - 0;
       int[] arr = new int[26];
       // s字符串字母出现一次加一
       for(int i=0;i<s.length();i++){
           int index = s.charAt(i) - offset;
           arr[index]++;
       }
       // t字符串字母出现一次减一
        for(int i=0;i<t.length();i++){
           int index = t.charAt(i) - offset;
           arr[index]--;
       }
       // 如果最终26个元素都为0,则返回true。否则返回false
       for(int i=0;i<arr.length;i++){
           if(arr[i] != 0){
               return false;
           }
       }
       return true;
    }
}

349-两个数组的交集

典型的使用set来解决,思路简单,只是set转集合这个语法自己不熟悉:可通过toArray将集合转为数组,但是这时集合的每个元素均是Object对象

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        // 这个用来存储nums1中出现的数
        HashSet<Integer> s = new HashSet<>(); 
        // 用于存储交集
        HashSet<Integer> s1 = new HashSet<>(); 
        for(int i=0;i<nums1.length;i++){
            s.add(nums1[i]);
        }

        for(int i=0;i<nums2.length;i++){
            // 判断,有则是共同的元素
            if(s.contains(nums2[i])){
                s1.add(nums2[i]);
            }
        }
        int[] arr = new int[s1.size()];
        int i=0;
        // set转数组
        for(Object o: s1.toArray()){
            arr[i++] = (int)o;
        }
        return arr;
        }
}

202-快乐数

这题本质上就是考基本功,思路不难,需要获得数的每位数,然后判断是否会变为1,如果可以变成1则直接返回true,然后通过hashset判断是否会走入循环,一旦set添加失败,表明是走入了循环

class Solution {
    public boolean isHappy(int n) {
        HashSet<Integer> set = new HashSet<>();
        int sum = 0;
        while(true){
            int digit = n % 10;
            sum += digit*digit;
            n = n / 10;
            if(n == 0){
                n = sum;
                // 只要和为1就是快乐数
                if(sum == 1){
                    return true;
                }
                sum = 0;
                // 只要出现了相同的数就是进入了循环
                if(!set.add(n)){
                    return false;
                }
               
            }
        }
    }
}

1-两数之和

通过map来解决(因为要返回索引,而set没有索引),但是使用的方式有点不一样,仔细体会

class Solution {
    public int[] twoSum(int[] nums, int target) {
      HashMap<Integer, Integer> map = new HashMap<>();
      int[] arr = new int[2];
      for(int i=0;i<nums.length;i++){
          int key = target-nums[i];
          // 每次判断set中有无对应的数值,有则返回
          if(map.containsKey(key)){
              arr[0] = map.get(key);
              arr[1] = i;
              return arr;
          }
          // 没有则将数值与索引存上,等待后续比较
          map.put(nums[i], i);
      }
      // 因为题目说了一定有答案,因此这条语句不会执行,为了通过语法检查而写
      return arr;
    }
}

总结

越来越觉得所谓的算法就是熟悉套路,太卷我也卷不动,掌握基本的就够了,重点抓项目!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值