p75 快乐数 (leetcode 202)

一:解题思路

这个题的本质和之前做过的单链表是否有环差不多。

方法一:利用一个集合set不断的变化数字,并将数字加入到集合set中,如果发现变换的数字最终为1则返回true,如果发现集合中以及存在之前变换的数字,则返回false。Time:O(1),Space:O(1)

方法二:快慢指针法,快指针每次走2步,慢指针每次走1步。当如果发现快指针等于1,或者快指针追上慢指针的时候就返回true。

二:完整代码示例 (C++版和Java版)

方法一C++:

class Solution {
public:
    int transform(int n)
    {
        int sum = 0;

        while (n != 0)
        {
            int a = n % 10;
            sum += a * a;
            n /= 10;
        }

        return sum;
    }

    bool isHappy(int n) 
    {
        if (n <= 0) return false;
        set<int> s;

        for (int i = n; i != 1; i=transform(i))
        {
            if (s.count(i) != 0) return false;
            s.insert(i);
        }

        return true;
    }
};

方法一Java:

class Solution {
        private int transform(int n)
        {
            int sum=0;
            
            while(n!=0)
            {
                int a=n%10;
                sum+=a*a;
                n/=10;
            }
            
            return sum;
        }   
        
        public boolean isHappy(int n) 
        {
               if(n<=0) return false;
               Set<Integer> s=new HashSet<>();
               
               for(int i=n;i!=1;i=transform(i))
               {
                   if(s.contains(i)) return false;
                   s.add(i);
               }
               
               return true;
        }
    }

方法二C++:

class Solution {
public:
    int transform(int n)
    {
        int sum = 0;

        while (n != 0)
        {
            int a = n % 10;
            sum += a * a;
            n /= 10;
        }

        return sum;
    }

    bool isHappy(int n) 
    {
        if (n <= 0) return false;
        int fast = n, slow = n;

        while (true)
        {
            fast = transform(transform(fast));
            slow = transform(slow);

            if (fast == 1) return true;
            if (fast == slow) return false;
        }
    }
};

方法二Java:

class Solution {
        private int transform(int n)
        {
            int sum=0;
            
            while(n!=0)
            {
                int a=n%10;
                sum+=a*a;
                n/=10;
            }
            
            return sum;
        }   
        
        public boolean isHappy(int n) 
        {
               if(n<=0) return false;
               int fast=n,slow=n;
               
               while(true)
               {
                   fast=transform(transform(fast));
                   slow=transform(slow);
                   
                   if(fast==1) return true;
                   if(fast==slow) return false;
               }
        }
    }

 

上一篇:202,linux端口平时笔记 (day202)


下一篇:5.4——202. 快乐数