今日学习的文章链接和视频链接
leetcode题目地址:202. 快乐数
代码随想录题解地址:代码随想录
题目简介
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
- 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
- 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
- 如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n
是 快乐数 就返回 true
;不是,则返回 false
看到题目的第一想法(可以贴代码)
1. 感觉本题联想不到哈希表的解法,取每次的n,对其%10,用ArrayList存储结果(可变长度数组),再进行快乐数的判定。
至于某数可能不是快乐数,为了避免无限循环,设置循环次数为 7 次(自定义)。
public boolean isHappy(int n) {
ArrayList<Integer> temp = new ArrayList<Integer>();
int times = 0;
while (times < 7){
while(n >= 1){
temp.add(n%10);
n = n/10;
}
int sum = 0;
for (int i : temp){
sum += Math.pow(i,2);
}
if (sum == 1) return true;
n = sum;
temp.clear();
times++;
}
return false;
}
实现过程中遇到哪些困难
无
看完代码随想录之后的想法
【解题思路】至于某数可能不是快乐数,为了避免无限循环,使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。
【想法】
1. 不必用ArrayList存每位数,再求平方和,每次取一个数直接平方然后+=sum里就行,同时求平方也可以直接 num*num。
看完视频自己写的ACC:
public boolean isHappy(int n) {
Set<Integer> s = new HashSet<Integer>();
while (n != 1 && !s.contains(n)){
s.add(n);
n = getNextN(n);
}
return n == 1;
}
private int getNextN(int n) {
int sum = 0;
while (n >= 1){
sum += (n % 10)*(n % 10);
n = n / 10;
}
return sum;
}
学习时长
9:00 ~ 9:26 解题成功
9:26 ~ 9:38 看视频题解、写博客
今日收获
1. 10 % 3 = 1 (remiander 求余运算) 19 / 10 = 1 (向下取整)
2. ArrayList 输出:System.out.println(arrlist.toString());
3. java 求次方:c=Math.pow(a, b)
4. ArrayList用法:arrlist.clear()删除所有元素
add() | 将元素插入到指定位置的 arraylist 中 |
addAll() | 添加集合中的所有元素到 arraylist 中 |
clear() | 删除 arraylist 中的所有元素 |
clone() | 复制一份 arraylist |
contains() | 判断元素是否在 arraylist |
get() | 通过索引值获取 arraylist 中的元素 |
indexOf() | 返回 arraylist 中元素的索引值 |
removeAll() | 删除存在于指定集合中的 arraylist 里的所有元素 |
remove() | 删除 arraylist 里的单个元素 |
size() | 返回 arraylist 里元素数量 |
isEmpty() | 判断 arraylist 是否为空 |
subList() | 截取部分 arraylist 的元素 |
set() | 替换 arraylist 中指定索引的元素 |
sort() | 对 arraylist 元素进行排序 |
toArray() | 将 arraylist 转换为数组 |
toString() | 将 arraylist 转换为字符串 |
ensureCapacity() | 设置指定容量大小的 arraylist |
lastIndexOf() | 返回指定元素在 arraylist 中最后一次出现的位置 |
retainAll() | 保留 arraylist 中在指定集合中也存在的那些元素 |
containsAll() | 查看 arraylist 是否包含指定集合中的所有元素 |
trimToSize() | 将 arraylist 中的容量调整为数组中的元素个数 |
removeRange() | 删除 arraylist 中指定索引之间存在的元素 |
replaceAll() | 将给定的操作内容替换掉数组中每一个元素 |
removeIf() | 删除所有满足特定条件的 arraylist 元素 |
forEach() | 遍历 arraylist 中每一个元素并执行特定操作 |