力扣简202 快乐数
SET
转换为循环问题 利用Set解决 利用快慢指针龟兔赛跑解决(弗洛伊德环问题)
自己手写:
10
1000
package leetcode01; /*编写一个算法来判断一个数 n是不是快乐数。 「快乐数」定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。 如果这个过程结果为1,那么这个数就是快乐数。 如果 n是快乐数就返回 true;不是,则返回 false.*/ public class Solution202 { public static int square(int n) { int res=0; int mul=n; int rem=0; while(mul!=0) { rem=mul%10; res=res+rem*rem; mul=mul/10; } return res; } public static boolean isHappy(int n) { int max=0; while(n!=1) { n=square(n); max++; if(max>=10) { //这里最开始设置为1000,然后不断提交尝试,测出当max为10也可以跑完。 break; } } if(n==1) return true; return false; } public static void main(String[] args) { // TODO Auto-generated method stub System.out.print(isHappy(19)); } }
题解一:用Set判断是否陷入循环
//题解一:计算后根据哈希集合判断是否进入了循环内 public static int square(int n) { int res=0; int mul=n; int rem=0; while(mul!=0) { rem=mul%10; res=res+rem*rem; mul=mul/10; } return res; } public static boolean isHappy(int n) { Set<Integer> set=new HashSet<Integer>(); int val=square(n); while(val!=1) { if(set.contains(val)) { return false; } else { set.add(val); } val=square(val); } return true; }
题解二:快速指针
public static int square(int n) { int res=0; int mul=n; int rem=0; while(mul!=0) { rem=mul%10; res=res+rem*rem; mul=mul/10; } return res; } public static boolean isHappy(int n) { int slow=n; int fast=square(n); while(slow!=fast) { slow=square(slow); fast=square(square(fast)); } return slow==1; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理