首页 > 其他分享 >LeetCode 202. 快乐数

LeetCode 202. 快乐数

时间:2023-10-28 10:07:04浏览次数:36  
标签:202 val int sum ret 我们 快乐 LeetCode


快乐数

题目链接 202. 快乐数

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

「快乐数」 定义为:

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

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

示例 1:

输入:n = 19 输出:true 解释: 12 + 92 = 82 82 + 22 = 68 62 + 82 = 100 12 + 02 + 02 = 1

题目解释

什么是快乐数,就是将我们数的每一位数计算他的平方,判断他是否是1,如果不是是1,我们持续上面的操作,直到我们遇到1,那么这个数就是快乐数.如果我们无法得到1,那么就是不快乐的.

算法原理

下面我们用两个例子来解析我们如何解决这道题目.

  • val是快乐数
  • val不是快乐数

我们发现,无论val是不是快乐数,我们都会陷入下面的情况.

这里很容易的想到我们在链表中判断是是否存在环.那么就可以使用快慢指针了.

  • 快指针走2步
  • 慢指针走1步

细节补充

  • 快慢指针中快指针走2步,慢指针走1步为何可以判断有环,这里不再解释,可以看看链表相关的
  • 我们上面经过若干次判断,难道一定会生成环的情况吗?不能是一条直线吗
  • 如何快速转换val的值

如果我们分析了题目中的快乐数的第二条定义,那么我们可以隐约猜到一定会存在环.这里也是可以简单的说明一下.我们说下鸽巢原理

鸽巢原理一般含义为:如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1个元素放到n个集合中去,其中必定有一个集合里至少有两个元素.

我们看一下我们的数据范围

  • 1 <= n <= 231 - 1

LeetCode 202. 快乐数_leetcode

这里我们会发现,对于我们每一次的val经过转换,都会出现在[0, 810]的结果内,只要我们转换超过810次,那么一定会出现重复的元素.

解决我们如何一次的转换val的值,很简单,提取每一位的值,经过平方后保存下来

int bitSum(int val)
{
    int sum = 0;
    while (val)
    {
      int ret = val % 10;
      sum += ret * ret;
      val /= 10;
    }
    return sum;
}

代码编写

class Solution
{
public:
  int bitSum(int val)
  {
    int sum = 0;
    while (val)
    {
      int ret = val % 10;
      sum += ret * ret;
      val /= 10;
    }
    return sum;
  }
  bool isHappy(int n)
  {
    int slow = n;
    int fast = n;
    while (true)
    {

      slow = bitSum(slow);
      fast = bitSum(bitSum(fast));
      if (slow == fast)
        break;
    }

    return slow == 1;
  }
};


标签:202,val,int,sum,ret,我们,快乐,LeetCode
From: https://blog.51cto.com/byte/8065000

相关文章

  • Leetcode 1089. 复写零
    复写零题目链接1089.复写零给你一个长度固定的整数数组arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。注意:请不要在超过该数组长度的位置写入元素。请对输入的数组就地进行上述修改,不要从函数返回任何东西。示例1:输入:arr=[1,0,2,3,0,4,5,0]输出:[1,0,0,......
  • LeetCode 611. 有效三角形的个数
    有效三角形的个数题目链接611.有效三角形的个数给定一个包含非负整数的数组nums,返回其中可以组成三角形三条边的三元组个数。示例1:输入:nums=[2,2,3,4]输出:3解释:有效的组合是:2,3,4(使用第一个2)2,3,4(使用第二个2)2,2,3示例2:输入:nums=[4,2,3,4]输出:......
  • Leetcode 283. 移动零
    移动零题目链接283.移动零给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下原地对数组进行操作。示例1:输入:nums=[0,1,0,3,12]输出:[1,3,12,0,0]示例2:输入:nums=[0]输出:[0]题目解释这道题目......
  • 20231005比赛
    T14883.灵知的太阳信仰Description在炽热的核熔炉中,居住着一位少女,名为灵乌路空。据说,从来没有人敢踏入过那个熔炉,因为人们畏缩于空所持有的力量——核能。核焰,可融真金。咳咳。每次核融的时候,空都会选取一些原子,排成一列。然后,她会将原子序列分成一些段,并将每段进行一次......
  • 2023-2024-1 20231414《计算机基础与程序设计》第5周学习总结
    学期(2023-2024-1)学号(20231414)《计算机基础与程序设计》第五周学习总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2023-2024-1计算机基础与程序设计第五周作业)这个作业的目标<Pep/9虚拟机,......
  • 2023-2024-1 20231405 《计算机基础与程序设计》第五周总结
    2023-2024-120231405《计算机基础与程序设计》第五周总结作业信息作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP作业要求在哪里https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/homework/13009作业的目标自学《计算机科学......
  • 「Log」2023.10.27 小记
    序幕\(\text{6:50}\):到校,早上稍微墨迹了一小会。一直不会的某个结论差不多会证明了,先写一下题再写写题解。\(\color{blueviolet}{CF1495D}\)此题是好题。考虑对于\(x\)和\(y\)共同的生成树一定包含两者的最短路径。先假设\(x,y\)最短路径有且只有一条,考虑其上一点\(......
  • 2021 CCPC桂林 B.A Plus B Problem (线段树)
    传送门线段树大模拟!。考验线段树功底的时候来了,作为队伍的史山选手,写这么史也是情有可原的。#include<bits/stdc++.h>usingll=longlong;constintINF=0x3f3f3f3f;constintN=1e6+10;typedefstd::pair<int,int>PII;#definelsu<<1#definersu<<1|......
  • 工作中遇到的坑:pg数据库保存时间[2023-10-10T01:12:32:910.345343]自动抹零
    今天数据入库的时候遇到了一个小问题。问题postrgrepSQL数据库中存储2023-10-10T01:12:32:910.345343类型的数据,数据库使用timestamp类型,存储完成后,会变成2023-10-1001:12:32.91自动将0抹掉解决方案使用TO_CHAR:数据库数据SELECT*FROMtest执行结果SELECTname,age,TO_CHAR(inp......
  • 2023-2024-1 20231320 《计算机基础与程序设计》第五周学习总结
    2023-2024-120231320《计算机基础与程序设计》第五周学习总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(2022-2023-1计算机基础与程序设计第五周作业)这个作业的目标<自学《计算机基础与......