LeetCode150道面试经典题-- 快乐数(简单)

1.题目

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n快乐数 就返回 true ;不是,则返回 false

2.示例

示例 1:

输入:n = 19

输出:true

解释:

12 + 92 = 82

82 + 22 = 68

62 + 82 = 100

12 + 02 + 02 = 1

示例 2:

输入:n = 2

输出:false


3.思路

快慢指针法

如果观察规律可以发现如果不是快乐数则会一直陷入一个循环之中。如图

此时可以定义两个指针,一个快指针,一个慢指针。快指针一次能走两格,慢指针只能一次走一格 。但是两者最后都会遇到,如果快指针先遇到1则结束循环或者龟兔两者相遇,此时就需要判断两者的数字,如果遇到的值并不是1,那么就说明不存在快乐数。

4.代码

LeetCode代码

java 复制代码
class Solution {
    public boolean isHappy(int n) {
        int slowPointer = n;
        int quickerPointer = getNext(n);
        while (quickerPointer!=1 &&quickerPointer!=slowPointer){
            quickerPointer = getNext(getNext(quickerPointer));
            slowPointer = getNext(slowPointer);
        }
        return quickerPointer==1;
    }
    public int getNext(int n){
        int sum =0;
        while (n>0){
            sum += Math.pow(n%10,2);
            n = n/10;
        }
        return  sum;
    }
}

时间复杂度O(logn)空间复杂度O(1)

具体案例代码:

java 复制代码
package LeetCode19;

public class javaDemo {
    public static void main(String[] args) {
        boolean flag ;
        int n = 4;
//        乌龟
        int slowPointer = n;
//        兔子
        int quickerPointer = getNext(n);
//        当兔子不是1或者两者还未相遇的时候则两者继续前进
        while (quickerPointer!=1 &&quickerPointer!=slowPointer){
            quickerPointer = getNext(getNext(quickerPointer));
            slowPointer = getNext(slowPointer);
        }
//        当兔子遇到1或者龟兔相遇时候判断龟兔相遇的时候值是否为1
        flag = quickerPointer==1;
//        输出结果
        System.out.println(flag);
    }
//    计算每一个的数字的平方和
    public static  int getNext(int n){
//        定义累计和
        int sum =0;
        while (n>0){
            sum += Math.pow(n%10,2);
            n = n/10;
        }
        return  sum;
    }
}

会了?试试挑战下一题!♪(^∀^●)ノシ (●´∀`)♪

LeetCode150道面试经典题-- 汇总区间(简单)_Alphamilk的博客-CSDN博客

相关推荐
wuqingshun3141595 小时前
什么是责任链模式,一般用在什么场景?
java·责任链模式
:-)5 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
wuqingshun3141596 小时前
说一下消息队列的模型有哪些?
java
fīɡЙtīиɡ ℡7 小时前
布隆过滤器
java
yaoxin5211237 小时前
462. Java 反射 - 获取声明类与封闭类
java·开发语言·python
kyriewen7 小时前
面试官让我优化一个卡死的表格,我打开 Claude 五秒重写,他放下咖啡问我要不要来当组长
前端·javascript·面试
wuqingshun3141599 小时前
MYSQL的乐观锁和悲观锁是什么?
java
Jerry9 小时前
LeetCode 101. 对称二叉树
算法
黄敬峰9 小时前
从零搭建 RAG 应用 —— 一个故事带你彻底搞懂检索增强生成
面试
唐青枫10 小时前
Java SLF4J 实战指南:从日志门面到 Logback、MDC 和链路追踪
java