【每日LeetCode】哈希表之快乐数

哈希映射

先看一遍之前做过的笔记 https://mp.weixin.qq.com/s/6SLt2NRx7nFVneeYFn6iYw 

再多去看一下网上查找的文章 多看几遍 HashMap in Java - GeeksforGeeks

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 = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        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的字母组成输出来
    }
}

啊啊啊啊不刷题了我要继续学操作系统了,我们计算机网络老师教的很好,别的老师的课我从来不听但是她的课我都是很认真听的,还有离散数学,上大学以来唯一能让我认真听的课就数学和计算机网络了,计组和操作系统我还是不指望我们学校老师了,靠自己学可能学的更快一点。啊啊啊啊啊还有一系列的什么Java web,之后ssm,然后springboot什么的太多了,我都搞不清楚要按什么路线来学,反正就是很迷茫,我高三都没有这样认真过。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值