题目
算法思路
对于此题的最终结局共有三种结果(但会发现有一种结果不存在)
- 重复过程直至出现数字1
- 重复过程出现此前存在的数,然后一直循环
- 一直无线下去,且越来越大(不存在)
思路一(哈希表)
思路分析
创建方法生成每次数字的平方和,在依次存入哈希表中,再存入的同时判断是否是数字1和此前出现过的数
源码
class Solution {
//哈希表
public boolean isHappy(int n) {
//存放每次求和出来的数
Set<Integer> set=new HashSet<>();
//不等于n且不等于集合中包含的数
while(n!=1&&!set.contains(n)){
set.add(n);
n=getNUmber(n);
}
return n==1;
}
public static int getNumber(int n){
int sum=0;
while(n>0){
int d=n%10;
n=n/10;
sum+=d*d;
}
return sum;
}
}
时间和空间复杂度
时间:O(logn)
空间:O(logn)
思路二(快慢指针)
思路分析
定义一个满指针和一个快指针,满指针每次前进一步,快指针每次前进2步,如果有相同的数,进入循环,快慢终会相遇,同时判断快指针是否等于1
源码
class Solution {
//快慢指针
public boolean isHappy(int n) {
int slow=n;
int fast=getNextNumber(n);
while(fast!=1&&fast!=slow){
slow=getNextNumber(slow);
//获得慢指针后面的2个数字(类似于链表)
fast=getNextNumber(getNextNumber(fast));
}
return fast==1;
}
public static int getNextNumber(int n){
int sum=0;
while(n>0){
int d=n%10;
n=n/10;
sum+=d*d;
}
return sum;
}
}
时间和空间复杂度
时间:O(logn)
空间:O(1)
思路三(无)
思路分析
源码
在这里插入代码片
时间和空间复杂度
所用API
public boolean contains(CharSequence s)
.contains()方法可以判断字符串包含关系
总结
- 对于给出一个数,求出它的每一位是我在写文章前一直不清楚的,
在次记录下
public class Test{
public static void main(String[] args) {
int a=9527;
print(a);
}
//递归
public static void print(int a){
if(a>9){
print(a/10);
}
System.out.println(a % 10 +"");
}
}
- 题中的return fast==1感觉特别的妙,记录一下
力扣题解链接
力扣题解
ps:仅为学习记录,如有错误,欢迎指正