今天你快乐了吗 之 快乐数与丑数
诶嘿我反正很快乐~
城市和高校封了二十几天后终于解封, 明天就阔以回家咯~
题目1: 快乐数
解题思路1:
快慢指针: 此处的快慢指针指的是, 快指针走两步, 慢指针走一步, 有环快慢指针就会相遇
把转换过程中的每一个数看做单链表的一个节点, 将1
看作单链表的最后一个元素, 如果无法从 n
转换为1
, 说明单链表中存在环, 即该数就不是快乐数
1.初始化两个数slowRunner
和fastRunner
为n
2.当slowRunner
不等于fastRunner
, 且fastRunner
不等于1
时, fastRunner
走两步, slowRunner
走一步;
3.一直往前走, 当slowRunner
和fastRunner
相遇, 且不等于1
时, 说明单链表中存在环, 即无法从n
转换成1
, 即该数不是快乐数
4.当fastRunner = 1
时, 该数就是快乐数
class Solution{
private int getNext(int n){
int totalSum = 0;
while(n > 0){
int d = n % 10;
n = n / 10;
totalSum += d * d;
}
return totalSum;
}
public boolean isHappy(int n) {
int slowRunner = n;
int fastRunner = getNext(n);
while(fastRunner != 1 && slowRunner != fastRunner){
slowRunner = getNext(slowRunner);
fastRunner = getNext(getNext(fastRunner));
}
return fastRunner == 1;
}
}
解题思路2:
使用哈希集合完成, 每次生成链中的下一个数字时, 检验一下它是否在哈希集合中
如果该数不在哈希集合中, 我们就将它添加进这个哈希集合
如果该数在哈希集合中, 即思路 1
中的快慢指针相遇处, 则我们处于一个循环中, 即返回false
class Solution {
private int getNext(int n){
int totalSum = 0;
while(n > 0){
int d = n % 10;
n = n / 10;
totalSum += d * d;
}
return totalSum;
}
public boolean isHappy(int n) {
Set<Integer> set = new HashSet<>();
while(n != 1 && !set.contains(n)){
set.add(n);
n = getNext(n);
}
return n == 1;
}
}
题目2: 丑数
解题思路:
如果该数是负数, 直接返回false
class Solution {
public boolean isUgly(int n) {
if(n <= 0){
return false;
}
while(n % 2 == 0){
n /= 2;
}
while(n % 3 == 0){
n /= 3;
}
while(n % 5 == 0){
n /= 5;
}
return n == 1;
}
}
根据上述代码举例:
n = 6
, 符合n % 2 == 0
, 那么执行n /= 2;
, 此时n = 6 / 2 = 3
n = 3
, 符合n % 3 == 0
, 那么执行n /= 3;
, 此时n = 3 / 3 = 1
已知1
通常被视为丑数, 则返回1
即可