朋友面試頭條二輪了,一輪的題目請看這一篇:頭條面試題:求用戶在線峯值和持續時間html
此次的面試題目是:判斷一個數是不是happy number(每一位的平方和最終爲1)git
知道題目首先要理解題目。所謂happy number就是一個整數每一個位數上的數字的平方相加,一直循環,若是最終能等於1,則就是happy number。面試
舉例:19app
第一次:1²=9²=82測試
第二次:8²+2²=68spa
第三次:6²+8²=100code
第四次:1htm
這樣的數就是happy number。blog
怎麼解決呢?這樣的問題能夠一直循環運算,發現等於1就是happy number,不等於就不是。我朋友就採起的是這種方法。但這種方法有個問題,若是不是happy number要何時中止循環進行判斷呢?由於不知道循環是不是重複的,或仍是無限不重複的循環。還有就是這種循環極容易溢出,因此最好的方法仍是要找出規律。get
如下就是個人線下手動運算,目的是找出規律:
從0~19的運算結果來看能夠得出如下結論:
1.0不是happy number;
2.全部happy number最終都能等於1;
3.全部不是happy number的數都是無限重複循環,且都從4開始循環。
得出了以上規律就能夠開始寫程序代碼了。
計算平方和的方法:
public static int SumSquares(int number) { var dic = new ArrayList(); while (true) { dic.Add(number % 10); if (number / 10 == 0) { break; } number = number / 10; } var num = 0; foreach (var item in dic) { num += (int)item * (int)item; } return num; }
判斷是不是Happy Number:
public static bool IsHappyNumber(int number) { while (true) { if (number == 4) break; if (number == 1) return true; number = GetNumber(number); } return false; }
最後在main方法中調用:
static void Main(string[] args) { while (true) { Console.WriteLine("請輸入一個整數(輸入exit退出):"); var writeText = Console.ReadLine(); if (writeText == "exit") break; var number = Convert.ToInt32(writeText); bool isHappyNumber = IsHappyNumber(number); if (isHappyNumber) Console.WriteLine("輸入的是一個Happy Number!"); else Console.WriteLine("輸入的不是一個Happy Number!"); Console.WriteLine(); } Console.ReadKey(); }
測試:
成功!!!
項目下載地址:https://gitee.com/jingboweilanGO/happy-number.git