leetcode刷题记录-202. Happy Number
2018-04-09 17:45
381 查看
leetcode刷题记录-202. Happy Number
1.题目要求
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.
Note:
You may assume that nums1 has enough space (size that is greater or equal to m + n) to hold additional elements from nums2. The number of elements initialized in nums1 and nums2 are m and n respectively.
Example: 19 is a happy number
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
2.问题分析
给定一个正整数,循环计算它的每一位的平方和,如果结果为1说明它是一个”happy number”返回true,如果没有出现1就返回false。关键点:
a.由于正整数的位数不确定,因此需要先统计它有多少位,再求累加平方和
b.循环计算的过程中,如何判断它不是一个“happy number”
3.解题思路
思路一一开始的想法是:首先计算初始的平方和,然后一直循环求当前的平方和,如果循环的过程中出现了平方和为1,那么就返回true,如果一直循环到当前平方和与初始平方和相等,就返回false。
这样的结果只能满足极个别的情况,主要是自己没有考虑周全。循环过程中确实会和之前的平方和有重复的情况,这就是一个循环,但是这个重复的值不一定就是初始值。所以这种方法有局限性。
思路二
参考别人的代码实现思路,单独写一个函数用于计算平方和。然后每次循环过程中分别计算两个值,一个值遍历速度要快些,另外一个值则逐个遍历。
因为无论是不是happy number,这样计算肯定会有重复的值出现,这个时候就完成了一个大循环。整个过程可以理解成两个人在绕一个大圈跑,一个人的速度比较快,另外一个人速度比较慢,那么速度快的那个人迟早会和速度慢的人相遇。相遇的那个值就是整个大循环的起点,如果这个点的值是1,说明是happy number,否则就不是。
4.代码实现
思路一bool isHappy(int n) { int n_temp = n; int i, sum, sum_cur; sum = sum_cur = 0; vector <int> digits; while (n_temp != 0)// { digits.push_back(n_temp % 10); n_temp /= 10; } for (i = 0; i < digits.size(); i++) { sum += digits[i] * digits[i]; } if (sum == 1) return true; sum_cur = sum; do { digits.clear(); n_temp = sum_cur; while (n_temp != 0) { digits.push_back(n_temp % 10);//得到每一位的数字 n_temp /= 10; } //求平方和 sum_cur = 0; for (i = 0; i < digits.size(); i++) { sum_cur += digits[i] * digits[i]; } if (sum_cur == 1) return true; } while (sum != sum_cur); return false; }
以上代码只能通过极少部分示例,比如输入是3就会无限循环停不下来。。。。。
思路二
//统计数字的每一位的平方和 int getSum(int n) { int i,output=0; vector <int> digits; while (n) { digits.push_back(n % 10); n /= 10; } for (i = 0; i < digits.size(); i++) { output += digits[i] * digits[i]; } return output; } bool isHappy(int n) { int n_temp = n; int i, sum_fast, sum_slow; sum_fast= sum_slow=n; while ((sum_fast != 1) && (sum_slow != 1)) { sum_slow = getSum(sum_slow); sum_fast = getSum(sum_fast); sum_fast = getSum(sum_fast); if ((sum_fast == sum_slow) && (sum_slow != 1)) { return false; } } return true; }
注:求数字的平方和的两种方式:
a.用”/”和”%”运算符求得每一位的数字后计算int getSum(int n) { int i,output,temp; output=0; vector <int> digits; while (n) { temp=n % 10; output+=temp*temp; n /= 10; } return output; }
b.先将数字转换成字符串,然后计算,需要包含sstream头文件
int getSum(int n) { int i,temp,count = 0; string number; stringstream ss; ss << n; ss >> number; for (i = 0; i < number.length(); i++) { temp = number[i] - '0'; count += temp*temp; } return count; }
相关文章推荐
- LeetCode 202 Happy Number(floyd判圈算法(龟兔赛跑算法))
- 20170306-leetcode-202-Happy Number
- LeetCode 202. Happy Number
- Leetcode 202. Happy Number
- Leetcode 202:Happy Number
- leetcode 202. Happy Number
- Java for LeetCode 202 Happy Number
- LeetCode *** 202. Happy Number
- leetcode_c++:哈希: Happy Number(202)
- leetcode 202. Happy Number
- LeetCode 202. Happy Number
- leetcode202. Happy Number
- [LeetCode202]Happy Number判断一个数是不是happy number
- LeetCode 202. Happy Number
- Leetcode 202 Happy Number
- leetcode202. Happy Number
- [leetcode] 202.Happy Number
- leetcode[202]:Happy Number
- LeetCode 202. Happy Number
- [LeetCode]258. Add Digits&202. Happy Number