前天晚上在加州高科技公司工作的女儿在跟妈妈视频闲聊时,得知我最近开始跟小朋友们玩起数据结构和算法了。就随口告诉我她工作面试中曾经遇到过的一个问题。这么多年了还记得,想必比较经典。我一听,果然挺有意思。
问题的描述很简单:就是把分数精确表达出来,比如
1/3 = 0.(3)
10/3 = 3.(3)
2/5 = 0.4
1/7 = 0.(142857)
括号代表循环小数的循环部分。
鬼使神差,当我在白纸上随便用一个分数找找感觉时,用的居然是 3/29。结果整张 A4 纸写到边了,还未见循环。到开始写程序了,才看到循环部分有 28 位之多。
开始并不顺利,特别想用字符串匹配的办法入手,却入不了手。结果在淋浴的时候计上心来,找到了问题的关键点,迎刃而解。后来女婿告诉我,他也曾被误导到字符串匹配 …
这是经典的用堆栈先将 infix expression 转成 postfix expression,接着还是用堆栈来求算结果的算法。很多教科书都省略了例子程序。有的虽然提供了例子程序,却相当冗长。
这里分享的是两个短小精悍的示例,可以分别独立玩味。
这是将 infix expression 转成 postfix expression 的程序:
#include<iostream>
#include<map>
using namespace std;
class S{
private:
int t=0;
char a[50];
public:
void pu(char c){a[t++]=c;}
char po(){return a[--t];}
char pe(){return …
1-on-1 tutor of chosen kids