您的位置:首页 > 科技 > 能源 > 菏泽小程序开发制作_企业网站建设实训报告_关于seo的行业岗位有哪些_如何做好网络营销推广

菏泽小程序开发制作_企业网站建设实训报告_关于seo的行业岗位有哪些_如何做好网络营销推广

2024/12/23 9:26:10 来源:https://blog.csdn.net/changan277/article/details/142418344  浏览:    关键词:菏泽小程序开发制作_企业网站建设实训报告_关于seo的行业岗位有哪些_如何做好网络营销推广
菏泽小程序开发制作_企业网站建设实训报告_关于seo的行业岗位有哪些_如何做好网络营销推广

1.题目概述

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

「快乐数」 定义为:

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

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

示例 1:

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

示例 2:

输入:n = 2
输出:false

提示:

  • 1 <= n <= 231 - 1

2.题目分析

快乐数的定义是基于一个计算过程,即对一个正整数,不断将其替换为它各个位上数字的平方和,如果最终这个过程能够收敛到1,则这个数被称为快乐数。相反,如果在这个过程中形成了一个不包含1的循环,则该数不是快乐数。对于非快乐数,它们的平方和序列会进入一个固定的循环,例如4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4。

为了证明每个循环的数字都是一样的,我们可以使用数学中的不动点理论。在一个有限的系统中,重复应用一个确定的操作最终会达到一个循环,这是因为系统的状态是有限的。在快乐数的情况下,由于每次计算都是基于有限的数字(0-9)的平方,因此可能的结果也是有限的。这意味着,如果我们从某个数字开始,不断重复计算它的各位数字的平方和,最终必然会进入一个循环,因为可能的平方和是有限的,而且每次计算都是确定性的。

此外,由于每个非快乐数都会进入一个固定的循环,而这个循环不包含1,这意味着循环中的所有数字都是固定的,并且每次遇到同一个数字时,都会得到相同的下一个数字。这就是为什么每个循环的数字都是一样的。

综上所述,我们可以得出结论,对于非快乐数,它们在重复计算各位数字的平方和的过程中不仅会形成一个循环,而且每个循环中的数字都是一样的。这一结论是基于有限性原理和确定性操作的重复应用。

因此我们可以使用哈希表和快慢指针来解决问题。

注意:此题不建议用集合记录每次的计算结果来判断是否进入循环,因为这个集合可能大到无法存储;另外,也不建议使用递归,同理,如果递归层次较深,会直接导致调用栈崩溃。不要因为这个题目给出的整数是 int 型而投机取巧。

3.题解

1.哈希表法

int getSum(int n) 
{int sum = 0;while (n) {sum += (n % 10) * (n % 10);n /= 10;}return sum;
}bool isHappy(int n){int sum = getSum(n);int hash[820] = {0};//核心思想:若某个数字重复出现了,则这个数字永远不可能会等于1while (sum != 1) {if (hash[sum] == 1) return false;else hash[sum]++;sum = getSum(sum);}return true;
}

2.快慢指针

int getSum(int n) 
{int sum = 0;while (n) {sum += (n % 10) * (n % 10);n /= 10;}return sum;
}bool isHappy(int n){int slow = getSum(n);       //慢指针走一步int fast = getSum(slow);    //快指针走两步while(1){if( slow==1 || fast==1 )return true;if(slow == fast)return false;slow=getSum(slow);  //走一步fast=getSum(getSum(fast));  //走两步}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com