学java+刷题日记——快乐数

31 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 18 天,点击查看活动详情

先来学习java数据结构基础知识。

集合-Set

集合底层实现是否有序数值是否唯一
HashSet哈希表无序唯一
LinkedHashSet哈希表+链表有序(按照添加的顺序)唯一
TreeSet红黑树(二叉树、二叉查找树、二叉平衡树)有序(自然的大小顺序)唯一

Set是无序的,相比Collection没有增加任何方法,List相比Collection增加了和索引相关的方法。如get(i) remove(i) add(i,elem) set(i,elem)

遍历set的方法

  1. for-each 循环
    for(String elem : set){
        System.out.println(elem);
    }
    
  2. 迭代器
    Iterator<String> it=set.iterator();
    while(it.hasNext()){
    String elem=it.next();
    System.out.println(elem);
    
  3. lambda表达式+流式编程
    set.forEach((elem)->System.out.println(elem+"!");
    

哈希表的结构和特点

哈希表也叫散列表,特点是很快

  • 结构:有多种,最流行:顺序表+链表
  • 主结构:顺序表,每个顺序表节点再单独引出一个链表

第202题. 快乐数

力扣题目链接(opens new window)

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为  1,那么这个数就是快乐数。

如果 n 是快乐数就返回 True ;不是,则返回 False 。

示例:

输入:19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

思路

这道题看起来很简单。要么找到一,要么一直循环,但是又想了想,一直循环的话,不就超时了吗?所以需要找到一个离开循环的突破点,一个是n等于一,而另一个关键的就是找到哈希表中后来是否出现与n重复的数,如果重复了,说明是个死循环,他就一定不是快乐数,那么此时就可以退出循环了。

代码

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set=new HashSet<>();
        while(n!=1 && !set.contains(n)){
            set.add(n);
            n=getNextNumber(n);
        }
        return n==1;
    }
    public int getNextNumber(int n){
        int sum=0;
        while(n>0){
            int a=n%10;
            sum+=a*a;
            n/=10;
        }
        return sum;
    }
}

写答案的时候磕磕碰碰的,反思了一下,难点就在于能想到自己写个函数来寻找下个数字。

然后就是判断快乐数的函数中while循环的条件,这个也就是思路中提到的。

最后还有个巧妙地点也就是在最后的return语句中,是return n==1,而不是在用if语句去判断了。这样如果等于就直接返回true,反之则是false了,就很简洁。