快乐数(202. 快乐数)
题目:
思路:
【1】本质上快乐数就是某个数的,各个位上的数的平方相加的到的是1就是快乐数【而且重复这个动作,最终得到的是1的也是快乐数】,而这个过程存在循环也就是会存在重复的数字进行重样的步骤,所以考虑到破解循环,一般要对数字进行记录,这便是比较常规的做法。
【2】但是又有一种更快的方式,就是用空间换时间,毕竟任何数算到最后都会得到一个100以内的数。
代码展示:
常规做法:
class Solution { public boolean isHappy(int n) { Set<Integer> set = new HashSet<>(); while (n != 1) { int sum = 0; while (n != 0) { sum += (n % 10)*(n % 10); n /= 10; } if (!set.add(sum)) { return false; } n = sum; } return true; } }
以空间换时间的方法【本质上任何数算到最后都会得到一个100以内的数,所以不妨把100以内的快乐数列个表【耗费一定的存储空间,以达到很快速查找】,然后进行查表】:
class Solution { public boolean isHappy(int n) { int[] h = new int[101]; h[1] = 1; h[7] = 1; h[10] = 1; h[13] = 1; h[19] = 1; h[23] = 1; h[28] = 1; h[31] = 1; h[32] = 1; h[44] = 1; h[49] = 1; h[68] = 1; h[70] = 1; h[79] = 1; h[82] = 1; h[86] = 1; h[91] = 1; h[94] = 1; h[97] = 1; h[100] = 1; int n0 = 0; while(n > 100){ while(n != 0){ n0 += (n % 10) * (n % 10); n /= 10; } n = n0; n0 = 0; } if(h[n] == 1) { return true; } return false; } }