前天晚上女儿在跟妈妈视频闲聊时,得知我最近开始跟小朋友们玩起数据结构和算法了。就随口告诉我她工作面试中曾经遇到过的一个问题。这么多年了还记得,想必比较经典。我一听,果然挺有意思。
问题的描述很简单:就是把分数精确表达出来,比如
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) 。
两天后,女儿发来一条信息: