トピックの説明:
アイデア: 高速ポインタと低速ポインタ
このループを見たときに、高速ポインタと低速ポインタの方法を思い出しました。タイトルから、現在の数値を継続的に使用して次の数値を生成するというプロセスをシミュレートする必要があることがわかります。生成ルールは二乗を累積することです現在の数値の結果は 1 であるか、最初の数値が幸せな数値であるか、無限ループであるかのいずれかです。
重要なのは、プログラムを無限にループさせることはできないが、いつ無限ループに陥るかを判断する必要があるということです。新しく生成された番号がすでに出現している場合、例 2 のように、これらの番号の生成プロセスで必然的にループに陥ります。
ループに入った後、「高速ポインター」と「低速ポインター」の考え方を使用してループを見つけることができます:「低速ポインター」は毎回 1 ステップかかり、「高速ポインター」は毎回 2 ステップかかります。 2 つが等しい、それがサイクルです。最後に、それが 1 によって引き起こされる循環であるかどうかを判断します。そうである場合、それは幸せな数であり、そうでない場合、それは幸せな数ではありません。
コード:
class Solution {
int NextN(int n) //返回n这个数每一位上的平方和(即这个数的下一位)
{
int sum = 0;
while(n != 0)
{
int t = n % 10;
sum += t * t;
n /= 10;
}
return sum;
}
public:
bool isHappy(int n) {
int slow = n;
int fast = NextN(n);
while(slow != fast)
{
slow = NextN(slow);
fast = NextN(NextN(fast));
}
return slow == 1;
}
};