包頭教育平臺(tái)網(wǎng)站建設(shè)qq群推廣平臺(tái)
🌻算法,不如說(shuō)它是一種思考方式🍀
算法專欄: 👉🏻123
一、🌱202. 快樂(lè)數(shù)
-
題目描述:編寫(xiě)一個(gè)算法來(lái)判斷一個(gè)數(shù) n 是不是快樂(lè)數(shù)。
「快樂(lè)數(shù)」 定義為:
對(duì)于一個(gè)正整數(shù),每一次將該數(shù)替換為它每個(gè)位置上的數(shù)字的平方和。
然后重復(fù)這個(gè)過(guò)程直到這個(gè)數(shù)變?yōu)?1,也可能是 無(wú)限循環(huán) 但始終變不到 1。
如果這個(gè)過(guò)程 結(jié)果為 1,那么這個(gè)數(shù)就是快樂(lè)數(shù)。
如果 n 是 快樂(lè)數(shù) 就返回 true ;不是,則返回 false 。 -
來(lái)源:力扣(LeetCode)
-
難度:簡(jiǎn)單
-
提示:
1 <= n <= 231 - 1 -
示例 1:
輸入:n = 19
輸出:true
解釋:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
🌾關(guān)于獲取數(shù)字的每一位元素
我們可以使用對(duì)10取余%
的方法獲取最后一位數(shù)組,所以取余在除循環(huán)到最后就可以得到每一位數(shù)字。
private static int[] geton(int n) {//返回存儲(chǔ)個(gè)位、十位、百位......的數(shù)組int k=n,s = 0;while (k>0) {k=k/10;s++;}int[] ans=new int[s];for (int i = 0; i < s; i++) {ans[i]=n%10;n=n/10;}return ans;
}
🌴解題
對(duì)于這個(gè)題,我們先想到數(shù)字每一位平方和,看到平方我們就會(huì)覺(jué)得最后的走向可能有三種:最后返回到1
、最后無(wú)限循環(huán)到某個(gè)數(shù)列圈里
、最后越來(lái)越大
。
而題目中沒(méi)有提到這個(gè)越來(lái)越大的可能,可以稍微推一下:一位數(shù)最大是9,平方是81,就是說(shuō)一位會(huì)產(chǎn)生兩位的下一個(gè)數(shù)
;兩位數(shù)最大是99,每一位平方和就是162,就是說(shuō)兩位會(huì)產(chǎn)生三位的下一個(gè)數(shù)
;三位數(shù)最大是999,每一位平方和就是243,然而三位沒(méi)有產(chǎn)生四位的下一個(gè)數(shù)
;四位數(shù)最大是9999,每一位平方和就是324,然而四位卻是產(chǎn)生三位的下一個(gè)數(shù)
;…;所以說(shuō)再大的數(shù)字最后平方和都會(huì)落入到三位數(shù)的區(qū)間。
那么當(dāng)平方和的過(guò)程中出現(xiàn)了前面出現(xiàn)的元素,必然就是走入了一個(gè)循環(huán)里,基于此可以如下解題:
1.hashSet
我們使用HashSet
來(lái)存儲(chǔ)平方和,每次都會(huì)看看是否出現(xiàn)過(guò)該數(shù)。
class Solution {public boolean isHappy(int n) {Set<Integer> s1=new HashSet<>();if(n==1)return true;while(n!=1){if(s1.contains(n)){//包含重復(fù)元素就會(huì)無(wú)限循環(huán)return false;}else {s1.add(n);//new nn=geton(n);}}return true;}private static int geton(int n) {//返回個(gè)位、十位、百位......平方int s = 0;while (n>0) {s+=(n%10)*(n%10);n=n/10;}return s;}
}
返回第一頁(yè)。?
?物有本末,事有終始,知所先后。🍭
🍎?????我的CSDN??????🍓