package com.fishercoder.solutions;

import java.util.HashSet;
import java.util.Set;

/**
 * 202. Happy Number
 *
 * Write an algorithm to determine if a number is "happy".
 * A happy number is a number defined by the following process:
 * Starting with any positive integer,
 * replace the number by the sum of the squares of its digits,
 * and repeat the process until the number equals 1 (where it will stay),
 * or it loops endlessly in a cycle which does not include 1.
 * Those numbers for which this process ends in 1 are happy numbers.
 *
 * Example: 19 is a happy number
 *
 * 12 + 92 = 82
 * 82 + 22 = 68
 * 62 + 82 = 100
 * 12 + 02 + 02 = 1
 */
public class _202 {
    public static class Solution1 {
        public boolean isHappy(int n) {
            if (n == 1) {
                return true;
            }
            Set<Integer> set = new HashSet();
            while (n != 1) {
                String str = String.valueOf(n);
                n = 0;
                for (int i = 0; i < str.length(); i++) {
                    int temp = Character.getNumericValue(str.charAt(i));
                    n += temp * temp;
                }
                if (n == 1) {
                    return true;
                }
                if (!set.add(n)) {
                    return false;
                }
            }
            return false;
        }
    }
}

@@ -572,19 +572,16 @@
  number%0A
- *%0A
  * 12 + 
@@ -837,17 +837,18 @@
 eger%3E se
-t
+en
  = new H
@@ -873,281 +873,252 @@
     
-while (n != 1) %7B%0A                String str = String.valueOf(n);%0A                n = 0;%0A                for (int i = 0; i %3C str.length(); i++) %7B%0A                    int temp = Character.getNumericValue(str.charAt(i));%0A                    n += temp * temp;%0A                %7D
+seen.add(n);%0A            int result = 0;%0A            while (result != 1) %7B%0A                result = getResult(n);%0A                if (seen.contains(result)) %7B%0A                    return false;%0A                %7D%0A                seen.add(result);
 %0A   
@@ -1126,37 +1126,35 @@
             
-if (
 n =
-= 1) %7B
+ result;
 %0A           
@@ -1142,32 +1142,38 @@
 result;%0A        
+    %7D%0A
             retu
@@ -1185,32 +1185,35 @@
 ue;%0A        
+%7D%0A%0A
         
 %7D%0A          
@@ -1204,77 +1204,153 @@
     
-%7D%0A                if (!set.add(n)) %7B%0A                    return false
+private Integer getResult(int num) %7B%0A            int result = 0;%0A            while (num != 0) %7B%0A                result += (num %25 10) * (num %25 10)
 ;%0A  
@@ -1355,33 +1355,42 @@
                 
-%7D
+num /= 10;
 %0A            %7D%0A 
@@ -1399,37 +1399,38 @@
          return 
-false
+result
 ;%0A        %7D%0A    

refactor 202