赞
踩
今日任务
什么时候想到用哈希法,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
什么时候使用哈希法,当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。
使用数组和set来做哈希法的局限。
由于字符串只包含 26个小写字母,因此我们可以维护一个长度为 26 的频次数组 table,先遍历记录字符串 s 中字符出现的频次,然后遍历字符串 t,减去 table 中对应的频次
- class Solution {
- public boolean isAnagram(String s, String t) {
- if (s.length() != t.length()) {
- return false;
- }
-
- int[] hashTable = new int[26];
- for (int i = 0; i < s.length(); i ++ ) {
- hashTable[s.charAt(i) - 'a']++;
- }
-
- for (int i = 0; i < t.length(); i ++ ) {
- hashTable[t.charAt(i) - 'a']--;
- if (hashTable[t.charAt(i) - 'a'] < 0) {
- return false;
- }
- }
- return true;
- }
- }
苦于 基础不牢语法不熟现去看了看基础依照思路写出来了
- class Solution {
- public int[] intersection(int[] nums1, int[] nums2) {
- if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
- return new int[0];
- }
- Set<Integer> set1 = new HashSet<>();
- Set<Integer> setList = new HashSet<>();
-
- for (int i : nums1) {
- set1.add(i);
- }
-
- for (int i : nums2) {
- if(set1.contains(i)) {
- setList.add(i);
- }
- }
-
- // 方法一: 将结果集合转化为数组
- // return setList.stream().mapToInt(x -> x).toArray();
-
- // 方法二: 创建一个新的数组存放setList中的值并返回
- int[] arr = new int[setList.size()];
- int flag = 0;
- for (int i : setList) {
- arr[flag++] = i;
- }
- return arr;
- }
- }
- class Solution {
- public int[] intersection(int[] nums1, int[] nums2) {
- int[] hash1 = new int[1010];
- int[] hash2 = new int[1010];
-
- List<Integer> resList = new ArrayList<>();
-
- for (int i : nums1) {
- hash1[i] ++;
- }
-
- for (int i : nums2) {
- hash2[i]++;
- }
-
- for (int i = 0; i < 1010; i ++) {
- if (hash1[i] > 0 && hash2[i] > 0) {
- resList.add(i);
- }
- }
-
- int index = 0;
-
- int[] res = new int[resList.size()];
- for (int i : resList) {
- res[index++] = i;
- }
- return res;
-
- }
- }
第一遍读题 emmmm没想法,看一眼提示 /思考 要存 set 也就是说这道题有重复的内容咯,每位数的平方和会重复!那也就是说会陷入循环,也就是说只要有重复内容就不是快乐数
- class Solution {
- public boolean isHappy(int n) {
- Set<Integer> set = new HashSet<>();
- while (n != 1 && !set.contains(n)) {
- set.add(n);
- n = getNext(n);
- }
- if (n == 1) {
- return true;
- }
- return false;
- }
-
- private int getNext(int n) {
- int sum = 0;
- while (n > 0) {
- int tmp = n % 10;
- sum += tmp * tmp;
- n /= 10;
- }
- return sum;
- }
- }
正如提示说的要用map KV,为什么用map呢?因为 要存 数值 和 下标 这两个值
- class Solution {
- public int[] twoSum(int[] nums, int target) {
- int[] res = new int[2];
-
- Map<Integer, Integer> map = new HashMap<>();
-
- if (nums == null || nums.length == 0) {
- return res;
- }
-
- for (int i = 0; i < nums.length; i++ ) {
- int tmp = target - nums[i];
- if (map.containsKey(tmp)) {
- res[0] = map.get(tmp);
- res[1] = i;
- break;
- }
- map.put(nums[i], i);
- }
- return res;
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。