每日刷题|哈希映射【两数之和|快乐数】

82 阅读3分钟

【leetcode 1 两数之和】

class Solution {
    public int[] twoSum(int[] nums, int target) {//方法定义了返回int
         for(int i=0; i < nums.length; i++){
            for(int j=i+1; j<nums.length; j++ ){
                if(nums[i] + nums[j] == target){
                   return new int[]{i,j};
                }
            }
         }
         return new int[0];
    }
}

首先我能想到的就是两层for循环遍历了 相加看是不是等于target

但是我不知道怎么输出[i,j] 然后看了题解return new int[]{i,j};也是云里雾里的,return new int[] {i, j}) 中的 int 显示了返回类型,但为什么使用关键字“new”?

去网上查了一下为什么要这样写

twoSum 方法定义了返回int,但是并没有“预先”声明一个数组来返回所需的元素,因此要返回一个数组,它必须在它之前使用“new”来创建一个具有所需内存分配的新数组可以分配并返回.

啊大概是懂了 吧。

哈希映射

先看一遍之前做过的笔记 mp.weixin.qq.com/s/6SLt2NRx7…

再多去看一下网上查找的文章 多看几遍 www.geeksforgeeks.org/java-util-h…

class Solution {
 public int[] twoSum(int[] nums, int target) {
  // 创建 HashMap
  Map<Integer, Integer> map = new HashMap<Integer, Integer>();//
  for (int i = 0; i < nums.length; i++) {
   // 判断数组nums是否存在target - nums[i]的key值
   if (map.containsKey(target - nums[i])) {// containsKey查找键是否存在
    // 存在就返回对应target-nums[i]的key值对应的下标和此时i的下标
    return new int[] { map.get(target - nums[i]), i };// get 根据键获取值
   }
   //不存在就把nums[i], i添加到map中
   map.put(nums[i], i);// put() 添加
  }
  throw new IllegalArgumentException("No two sum solution");// 如果最终都没有结果则抛出异常
 }
}

快乐数

啊啊啊啊啊啊快乐不起来啊,我记得我之前是看过这个题的,有思路但是写不出来给我劝退了,我就不信了这一次还做不出来

二话不说上哈希表解法哼

就是先给这个数n数位分离,然后求平方相加就得到下一个数,每一次进行这样的计算后就判断是不是在这个集合中,不存在的话则将其加入集合中,在的话就不是快乐数。

为什么要这样说呢!!!为啥曾经出现过就肯定不是快乐数,以前不懂我现在懂了,就拿2举例,就这样一直下去是跳不出来的是无限循环的,重复出现过的就说明它已经存在了,就不是快乐数。

class Solution {
    private int getNextNumber(int n) {
        int res = 0;
        while (n > 0) {
            //数位分离
            int temp = n % 10;
            res += temp * temp;
            n = n / 10;
        }
        return res;
    }
    public boolean isHappy(int n) {
        //构建一个空的HashSet对象
        Set<Integer> record = new HashSet<>();
        //contains() 方法用于检查 HashSet 中是否存在特定元素
        //如果集合中存在某个元素,则用于返回 true。
        while (n != 1 && !record.contains(n)) {
            //HashSet 类的 add() 方法在内部调用了put()方法
            record.add(n);//不存在则将n加入集合中
            //调用方法将当前数替换为它每个位置上的数字的平方和。
            n = getNextNumber(n);
        }
        return n==1;//如果n为1,则是快乐数
    }
}

加一个题 罗马数转整数

class Solution {
    public String intToRoman(int num) {
        int[] value = {1000900500400100905040109541};
        String[] reps = {"M""CM""D""CD""C""XC""L""XL""X""IX""V""IV""I"};

        StringBuffer ans = new StringBuffer();//用来记录组成数字的字母
        for (int i = 0; i < value.length; i++) {
            //如果该数超过了上面列的数之一
            while (num >= value[i]) {
                num = num - value[i];
                ans.append(reps[i]);//追加value[i]对应的字母reps[i]
            }
        }
        return ans.toString();//把最终的ans的字母组成输出来
    }
}