前天晚上女兒在跟媽媽視頻閑聊時,得知我最近開始跟小朋友們玩起數據結構和算法了。就隨口告訴我她工作麵試中曾經遇到過的一個問題。這麽多年了還記得,想必比較經典。我一聽,果然挺有意思。
問題的描述很簡單:就是把分數精確表達出來,比如
1/3 = 0.(3)
10/3 = 3.(3)
2/5 = 0.4
1/7 = 0.(142857)
括號代表循環小數的循環部分。
鬼使神差,當我在白紙上隨便用一個分數找找感覺時,用的居然是 3/29。結果整張 A4 紙寫到邊了,還未見循環。到開始寫程序了,才看到循環部分有 28 位之多。
開始並不順利,特別想用字符串匹配的辦法入手,卻入不了手。結果在淋浴的時候計上心來,找到了問題的關鍵點,迎刃而解。後來女婿告訴我,他也曾被誤導到字符串匹配方向去過。感覺真像個陷阱。
我把算法思想(時間複雜度為O(n),n是分母)提交給女兒。她說:“That’s the simplest solution”。
這是完整的c++程序:
其實程序的空間複雜度也是 O(n) 。
兩天後,女兒發來一條信息: