leetcode_202. 快乐数


编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

示例 1:

输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

 1 int getsum(int n) {
 2     int sum = 0;
 3     while(n != 0) {
 4         sum += (n%10) * (n%10);
 5         n = n / 10;
 6     }
 7     return sum;
 8 }
 9 
10 
11 bool isHappy(int n){
12     int *hash = (int *)malloc(sizeof(int) * 1000) ;
13     memset(hash, 0, sizeof(int) * 1000);
14 
15     int flag = 0;
16     n = getsum(n); // 这里先算一步是关键, 要不然 1000个内存肯定不够,数据是 2的31次方 -1
17     while(n != 1) {
18         if(hash[n] == 1) {
19             flag = 1;
20             return false;
21         }
22         hash[n]++;
23         n = getsum(n);         
24     }
25     return true;
26 }

方法2 : 

用 ut_hash 不用考虑 malloc  的内存大小

 1 typedef struct {
 2     int key;
 3     UT_hash_handle hh;
 4 }Hash;
 5 
 6 Hash *users = NULL;
 7 
 8 int GetSums(int n) {
 9      int sum = 0;
10      while(n != 0) {
11         sum += (n%10) * (n%10);
12         n = n / 10;
13      }
14      return sum;
15 }
16 
17 bool isHappy(int n) {
18     users = NULL;
19     int res = 0;
20     while(n != 1) {
21         res = GetSums(n);
22         Hash *tmp = NULL;
23         HASH_FIND_INT(users, &res, tmp);
24         if(tmp) {
25             return false;
26         } else {
27             tmp = (Hash *)calloc(1, sizeof(Hash));
28             tmp->key = res;
29             HASH_ADD_INT(users, key, tmp);
30         }
31         n = res;
32     }
33     Hash *cur = NULL;
34     Hash *tmp = NULL;
35     HASH_ITER(hh, users, cur, tmp) {
36         if(cur) {
37             HASH_DEL(users, cur);
38             free(cur);
39         }
40     }
41     return true;
42 }

方法3 : 龟兔赛跑

int getsum(int n) {
    int num = 0;
    while(n != 0){
        num = num + (n%10) * (n%10);
        n = n / 10;
    }
    return num;
}


bool isHappy(int n){
    int slow = getsum(n);
    int fast = getsum(n);
    fast = getsum(fast);

    while(slow != fast) {
        slow = getsum(slow);
        fast = getsum(fast);
        fast = getsum(fast);
    }

    if(slow == 1) {
        return true;
    }else {
        return false;
    }

}

相关