快乐数(双指针,哈希表)
生活随笔
收集整理的這篇文章主要介紹了
快乐数(双指针,哈希表)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
快樂數(shù)
- 方法一:用哈希表來記錄
- 方法二、雙指針
題目:編寫一個(gè)算法來判斷一個(gè)數(shù) n 是不是快樂數(shù)。
「快樂數(shù)」定義為:
對于一個(gè)正整數(shù),每一次將該數(shù)替換為它每個(gè)位置上的數(shù)字的平方和。
然后重復(fù)這個(gè)過程直到這個(gè)數(shù)變?yōu)?1,也可能是 無限循環(huán) 但始終變不到 1。
如果 可以變?yōu)?1,那么這個(gè)數(shù)就是快樂數(shù)。
如果 n 是快樂數(shù)就返回 true ;不是,則返回 false 。
思路:如果數(shù)是不快樂的數(shù),那么就會(huì)進(jìn)入循環(huán)當(dāng)中。所以我們記錄每一個(gè)數(shù),如果有重復(fù)那么就返回FALSE;
性質(zhì):不是快樂數(shù)的數(shù)稱為不快樂數(shù)(unhappy number),所有不快樂數(shù)的數(shù)位平方和計(jì)算,最後都會(huì)進(jìn)入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循環(huán)中
方法一:用哈希表來記錄
代碼:
bool isHappy(int n) {long long t = n;unordered_map<int,int>key;key.insert(pair<int,int>(n,1));while(1){t = 0;while(n) //分解位數(shù){int temp = n%10;n/=10;t += temp * temp;}n= t;if(n==1){return true;}if(key.count(t))return false;key.insert(pair<int,int>(t,1));} } 也可以用 vector 代碼: bool isHappy(int n) {long long t = n;vector<int>cnt;cnt.push_back(n);while(1){t = 0;while(n){int temp = n%10;n/=10;t += temp * temp;}n= t;if(n==1){return true;}if(find(cnt.begin(), cnt.end(), t) != cnt.end())return false;cnt.push_back(t);}}方法二、雙指針
方法二:雙指針 /參考英文網(wǎng)站熱評第一。這題可以用快慢指針的思想去做,有點(diǎn)類似于檢測是否為環(huán)形鏈表那道題//如果給定的數(shù)字最后會(huì)一直循環(huán)重復(fù),那么快的指針(值)一定會(huì)追上慢的指針(值),也就是//兩者一定會(huì)相等。如果沒有循環(huán)重復(fù),那么最后快慢指針也會(huì)相等,且都等于1。 代碼; public boolean isHappy(int n) {int fast=n;int slow=n;do{slow=squareSum(slow);fast=squareSum(fast);fast=squareSum(fast);}while(slow!=fast);if(fast==1)return true;else return false;}private int squareSum(int m){int squaresum=0;while(m!=0){squaresum+=(m%10)*(m%10);m/=10;}return squaresum; }總結(jié)
以上是生活随笔為你收集整理的快乐数(双指针,哈希表)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谭浩强课后题(数组篇)
- 下一篇: 利用urllib3 抓取博客列表