算法day05 | Java | 哈希表 | LeetCode 242,349,202,1

71 阅读2分钟

java基础

  1. 数组初始化int []num = new int[26];

  2. String是一个类,求其长度是一个方法,所以要加小括号

  3. java中string不能拆 char[]

  4. for i遍历 i是元素值,而不是下标

  5. 哈希表有:数组、Set、Map

  6. java set-hashset# Java集合(七)Set、HashSet

//力扣中这两句必须要加
import java.util.HashSet;
import java.util.Set;

Set<Integer> set1 = new HashSet<>();
set1.add(1);
set1.add(2);

if (set1.contains(i)) {xxx}

// 集合转化为数组
//方法一
return set1.stream().mapToInt(x -> x).toArray();

//方法二
int[] arr = new int[set1.size()];
int j = 0;
for(int i : resSet){
  arr[j++];
}

我的错误:HashSet拼写有误、初始化少了<>、for i遍历 i是元素值,而不是下标

7.map

Map<Integer,Integer> mymap = new HashMap<>();
mymap.put(nums[i],i);
if(mymap.containsKey(temp)) {...}

242.有效的字母异位词

出错的点: 1、Java数组初始化错误, 2、求String长度,length() 正确解法:

class Solution {
    public boolean isAnagram(String s, String t) {
        int []num = new int[26];
        //String是一个类,求其长度是一个方法,所以要加小括号
        for(int i=0; i<s.length(); i++) {
            char str = s.charAt(i);
            num[str-'a'] += 1; 
        } 

        for(int i=0; i<t.length(); i++) {
            char str = t.charAt(i);
            num[str-'a'] -= 1; 
        } 

        for(int i=0; i<num.length; i++) {
            if(num[i]!=0) {
                return false;
            }
        }
        return true;
    }
}

image.png

349. 两个数组的交集

示例1告诉我们,是要去重的 image.png

哈希表擅长解决: 给你一个元素判断是否出现过

如果数值很大,用数组就不合适。

我的错误:① HashSet相关操作 ② for i遍历 i是元素值,而不是下标 ③ 没有import引用

import java.util.HashSet;
import java.util.Set;

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

        int[] res = new int[set2.size()];
        int k = 0;
        for(int j : set2) {
            res[k++] = j;
        }

        return res;
    }
}


image.png

202. 快乐数

之前的总结。

超时版本:之前是可以的,不知道是力扣问题还是代码有误,一直提示超时

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> myset = new HashSet<>();

       int sum = 0;
       int num = n; 
        while(true) {
            sum = 0;
            while(num!=0) {
                int x = num%10; 
                sum += x*x;
                num=num/10; 
            }
            if(sum == 1) { return true; }

            if(!myset.contains(num)) {
                myset.add(sum); //这里是把sum添加进去
            } else{
                return false;
            }
            num = sum;
        }
    }
}

image.png

正确版本(提取函数):

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> myset = new HashSet<>();

        while(true) {
            n = getSum(n);
            if(n == 1) { return true; }

            if(!myset.contains(n)) {
                myset.add(n); //这里是把sum添加进去
            } else{
                return false;
            }
        }
    }

    private int getSum(int num) {
        int sum= 0;
        while(num != 0) { //这里不能写 while(num)
            int tmp = num % 10;
            sum += tmp*tmp;
            num /= 10;
        }
        return sum;
    }
}

1. 两数之和

return写在if单分支会有歧义

image.png

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer>mymap = new HashMap<Integer,Integer>();
        int[] res = new int[2];
        for(int i=0; i<nums.length; i++) {
            int tmp = target-nums[i];

            if(mymap.containsKey(tmp)) {
                res[0] = i;
                res[1] = mymap.get(tmp);
                break;
            } 
            
            mymap.put(nums[i],i);
        }
        return res;
    }
}