[Алгоритм — двойной указатель] LeetCode 202 Счастливое число

Описание темы: 

Идея: быстрые и медленные указатели

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

результат:

Supongo que te gusta

Origin blog.csdn.net/weixin_44906102/article/details/132287031
Recomendado
Clasificación