Описание темы:
Идея: быстрые и медленные указатели
Когда я увидел цикл, я вспомнил метод быстрых и медленных указателей.Из названия видно, что нам нужно смоделировать процесс: непрерывно использовать текущее число для генерации следующего числа.Правило генерации — накапливать квадраты текущего числа; Результатом является либо 1, тогда исходное число является счастливым числом, либо это бесконечный цикл.
Ключ в том, что мы не можем позволить программе работать бесконечно, но мы должны определить, когда она попадет в бесконечный цикл. Если вновь сгенерированный номер уже появился, он неизбежно попадет в цикл в процессе генерации этих чисел, как в примере 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;
}
};