一、题目解析

我们结合示例来看看


(鸽巢原理:有n个巢,n+1只鸽子,至少有一个巢的鸽子数大于1,。我们可以知道int的最大值为2.1x10^9,我们取9999999999,这比int大的多了,这时它的平方数为9^2x10=810,所以我们得到了一个范围及int产生的平方数的范围【1,810】,当经历811次操作后,根据鸽巢原理,必然会出现一个相同的数,即会出现循环)
看着这个环大家是不是很熟悉,这也是能用双指针的原因。
二、算法原理
平常的双指针我们都用于记录数组下标或者就是指针,那么我们这里该怎么处理呢?我们能发现平方数是不断更新的,所以我们可以用平方数的值用于做双指针。
成环问题多用于快慢指针(双指针的一种),slow走一步,fast走两步,这里就是更新平方值的次数。

我们的循环条件为slow != fast,为了避免赋值时slow和fast值相同导致不能进入循环,我们可以让fast指向下一个平方数,为了方便计算平方数,我们需要自己实现一个函数去计算平方数。对于最后返回的bool值,我们只需要对相遇位置的值是否等于1即可。
现在可以根据原理去自己实现一下,202. 快乐数 - 力扣(LeetCode)
三、代码示例
由于c语言版和c++版差别不大,所以这里展示c++版。


看到这里,如果对您有所帮助请留下一个免费的赞,期待我们下期再见!