开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 18 天,点击查看活动详情
先来学习java数据结构基础知识。
集合-Set
集合 | 底层实现 | 是否有序 | 数值是否唯一 |
---|---|---|---|
HashSet | 哈希表 | 无序 | 唯一 |
LinkedHashSet | 哈希表+链表 | 有序(按照添加的顺序) | 唯一 |
TreeSet | 红黑树(二叉树、二叉查找树、二叉平衡树) | 有序(自然的大小顺序) | 唯一 |
Set是无序的,相比Collection没有增加任何方法,List相比Collection增加了和索引相关的方法。如get(i) remove(i) add(i,elem) set(i,elem)
遍历set的方法
- for-each 循环
for(String elem : set){ System.out.println(elem); }
- 迭代器
Iterator<String> it=set.iterator(); while(it.hasNext()){ String elem=it.next(); System.out.println(elem);
- lambda表达式+流式编程
set.forEach((elem)->System.out.println(elem+"!");
哈希表的结构和特点
哈希表也叫散列表,特点是很快
- 结构:有多种,最流行:顺序表+链表
- 主结构:顺序表,每个顺序表节点再单独引出一个链表
第202题. 快乐数
编写一个算法来判断一个数 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了,就很简洁。