202.快乐数

题目

Write an algorithm to determine if a number is “happy”.

A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers.

Example:

Input: 19
Output: true
Explanation: 
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

分析

  • 这种数据生成方式和链表结构相似,可以用处理链表的方式来处理这道题目
  • 如果数据不以1结尾,则一定会成环。所有可以用判断链表是否有环的方式来做这道题。如果有环,不是happy number,如果没有环,是happy number.

代码和注释

int get_next(int n) {
    int ans = 0;
    while(n) {
        ans += (n % 10) * (n % 10);
        n /= 10;
    }
    return ans;
}

bool isHappy(int n) {
    int p;
    int q;
    p = q = n;
    do {
       p = get_next(p); //从当前节点开始走一步,相当于慢指针
       q = get_next(get_next(q)); // 从当前节点开始走两步,相当于快指针
    }while(p != q); //如果成环,一定可以相遇,p == q ; 如果没有环,最后都能走到末尾
    if (p != 1) return false; //如果没有环,到最后一定是1
    return true;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值