摘要:今天在上刷題的時(shí)候遇到了一個(gè)有趣的問題,問題描述如下題目大意題目大概意思是說將一個(gè)數(shù)按照個(gè)十百千位來分解如果有的話,然后求他們的平方的和,得到結(jié)果后重復(fù)這個(gè)過程。
今天在LeetCode上刷題的時(shí)候遇到了一個(gè)有趣的問題,問題描述如下:
Write an algorithm to determine if a number is “happy”.Happy Number 題目大意
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
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1
題目大概意思是說將一個(gè)數(shù)按照 個(gè)、十、百、千位來分解(如果有的話),然后求他們的平方的和,得到結(jié)果后重復(fù)這個(gè)過程。最后結(jié)果為1,則該數(shù)字為happ number,則返回true,否則返回false
題目分析第一眼看到題目其實(shí)是有點(diǎn)懵逼的,咋一看不知道循環(huán)結(jié)束的條件。其實(shí)循環(huán)結(jié)束的條件在題目中已經(jīng)指出來——不為happly number的時(shí)候這個(gè)循環(huán)是重復(fù)的,所以說在這個(gè)循環(huán)的過程當(dāng)中,推算出來的式子是有重復(fù)的部分,下面給出數(shù)字為6的時(shí)候式子的變換過程:
0^2 + 6^2 = 36 3^2 + 6^2 = 45 4^2 + 5^2 = 41 4^2 + 1^2 = 17 1^2 + 7^2 = 50 5^2 + 0^2 = 25 2^2 + 5^2 = 29 2^2 + 9^2 = 85 8^2 + 5^2 = 89 (循環(huán)起始部分 8^2 + 9^2 = 145 1^2 + 4^2 + 5^2 = 42 4^2 + 2^2 = 20 2^2 + 0^2 = 4 4^2 + 0^2 = 16 1^2 + 6^2 = 37 3^2 + 7^2 = 58 (一輪循環(huán)結(jié)束 5^2 + 8^2 = 89 (循環(huán)重新開始
可以看到當(dāng)不為happy number的時(shí)候,式子在推算到一定程度,就會(huì)開始死循環(huán),根據(jù)這個(gè)特點(diǎn),這里我使用集合的特性來存儲(chǔ)式子,通過判斷式子是否重復(fù)來界定是否為happy number
AC代碼/** * @param {number} n * @return {boolean} */ var isHappy = function (n) { let result = String(n).split(""),counter = 1 let collections = new Set() collections.add(result.join("")) while (counter === collections.size) { result = result.reduce((total, currentValue) => { return total + Math.pow(currentValue, 2) }, 0) counter++ collections.add(String(result)) result = String(result).split("") if(result[0] === "1" && result.length === 1){ return true } } return false }其他解法
在LeetCode上我發(fā)現(xiàn)我的思路還是具有普遍性,但是網(wǎng)站上我看到了兩種比較有意思的解法,下面是具體的代碼:
解法1: Using fact all numbers in [2, 6] are not happy (and all not happy numbers end on a cycle that hits this interval):
(大意就是說利用非happy number在[2,6]這個(gè)區(qū)間的特性來判斷是否為happy number
bool isHappy(int n) { while(n>6){ int next = 0; while(n){next+=(n%10)*(n%10); n/=10;} n = next; } return n==1; }
解法2:I see the majority of those posts use hashset to record values. Actually, we can simply adapt the Floyd Cycle detection algorithm. I believe that many people have seen this in the Linked List Cycle detection problem. The following is my code:
(大意是說利用修改 Floyd Cycle 來判斷是否為happy number
int digitSquareSum(int n) { int sum = 0, tmp; while (n) { tmp = n % 10; sum += tmp * tmp; n /= 10; } return sum; } bool isHappy(int n) { int slow, fast; slow = fast = n; do { slow = digitSquareSum(slow); fast = digitSquareSum(fast); fast = digitSquareSum(fast); } while(slow != fast); if (slow == 1) return 1; else return 0; }
掃描下方的二維碼或搜索「tony老師的前端補(bǔ)習(xí)班」關(guān)注我的微信公眾號,那么就可以第一時(shí)間收到我的最新文章。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/88454.html
摘要:集合法復(fù)雜度時(shí)間待定空間待定思路根據(jù)快樂數(shù)的計(jì)算方法,我們很難在有限步驟內(nèi)確定一個(gè)數(shù)是否是快樂數(shù),但使用排除法的話,我們可以嘗試確定一個(gè)數(shù)不是快樂數(shù)。根據(jù)題意,當(dāng)計(jì)算出現(xiàn)無限循環(huán)的時(shí)候就不是快樂數(shù)。 Happy Number Write an algorithm to determine if a number is happy. A happy number is a number...
Problem 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 squar...
摘要:類型類型重排序方法升序降序方法返回從參數(shù)指定位置開始到當(dāng)前數(shù)組末尾的所有項(xiàng)。要注意的是,傳遞給構(gòu)造函數(shù)的兩個(gè)參數(shù)都是字符串不能把正則表達(dá)式字面量傳遞給構(gòu)造函數(shù)。由于構(gòu)造函數(shù)的模式參數(shù)是字符串,所以在某些情況下要對字符串進(jìn)行雙重轉(zhuǎn)義。 Object類型 Array類型 重排序方法: compare 升序: function compare(value1, value2){ ...
摘要:元素是通過指定的分隔符進(jìn)行分隔的。返回值如果從中刪除了元素,則返回的是含有被刪除的元素的數(shù)組。根據(jù)使用的方法不同,這個(gè)函數(shù)執(zhí)行后的返回值可能會(huì)也可能不會(huì)影響訪問的返回值。對數(shù)組中的每一項(xiàng)運(yùn)行給定函數(shù),返回該函數(shù)會(huì)返回的項(xiàng)組成的數(shù)組。 Object類型 創(chuàng)建object實(shí)例方法有兩種。第一種方法使用new操作符后跟object構(gòu)造函數(shù)。如下: var person=new Object(...
閱讀 1660·2021-11-16 11:41
閱讀 2458·2021-11-08 13:14
閱讀 3106·2019-08-29 17:16
閱讀 3079·2019-08-29 16:30
閱讀 1843·2019-08-29 13:51
閱讀 356·2019-08-23 18:38
閱讀 3223·2019-08-23 17:14
閱讀 630·2019-08-23 15:09