今天在网上搜索汉字的排序问题,结果不经意的搜到了一个帖子,内容是关于汉字转化数字的问题。看了一些人的解法,感觉程序的写得很混乱,思路一点也不清晰。。这让我想到了面对一个问题的时候,思路是多么的重要,算法和数据结构正是给我们提供了一个解决问题的思路,或者说指导思想。当我们面对一个问题的时候,首先大脑去算法和数据结构里找方案,看看那个算法或者哪个数据结构适合解决这个问题。因为算法和数据结构都是在前人几十年经验的基础上形成的,所以常规的问题,往上一套就可以找到解决方案。当然书本上的那些算法还是不够,还要学习更深一些的算法,比如遗传算法什么的,但是至少算法里已经将这些问题作了一个分类,分治,动态规划,贪心,分枝限界,回朔等,至少能够想到问题能用哪一类算法去解决。。对于一些简单的问题,可能只需要用一个数据结构就能解决了,而不需要复杂算法。。比如下面这个问题。。当我看了一些烦躁的解答之后突然看到一个让我眼前一亮的解答,dlyme给出的,用栈来解决这个问题。一个简单的出栈入栈法则,最后加和就行了。。思路非常的清洗,代码量也非常小。。这才是一个优秀的程序员应该具备的能力。让我好生佩服,所以我加了他为好友。希望能做个朋友。下面也引用了这位仁兄的帖子内容。

 

这是google的一道面试题.

将汉字转换成数字, 如下
一          1
十          10
十一        11
二十        20
二十一      21
一百        100
一百零一    101
一百一十    110
一百一十一  111

当然算法要能将所有的汉字数字转换成阿拉伯数字,同时兼顾性能.

路过的大家不妨试试看... ...

用一个栈就可以实现转化:
如果新读入的汉字(假设它代表的数字为N)比栈顶数字还要大
{
    弹出栈中所有比N小的元素,并将这些元素累加,假设结果为S;
    将S*N入栈;
}
否则
{
    将N直接入栈;
}
最后将栈中所有数字相加就可以。

 

举例:一亿一千二百五十八万三千二百四十(112,583,240)
第1步==>处理“一”,N=1
直接入栈,
此时栈中元素为:1 (右侧是栈顶)
第2步==>处理“亿”,N=100000000
弹出栈中唯一的元素,然后S=1,将S*N=100000000入栈
此时栈中元素为:100000000
第3步==>处理“一”,N=1
直接入栈
栈中元素为:100000000,1
第4步==>处理“千”,N=1000
弹出栈中比N小的元素(只有一个),然后S=1,将S*N=1000入栈
此时栈中元素为:100000000,1000
第5步==>处理“二”,N=2
直接入栈
此时栈中元素为:100000000,1000,2
第6步==>处理“百”,N=100
弹出栈中比N小的元素(只有一个),然后S=2,将S*N=200入栈
此时栈中元素为:100000000,1000,200
第7步==>处理“五”,N=5
直接入栈
此时栈中元素为:100000000,1000,200,5
第8步==>处理“十”,N=10
弹出栈中比N小的元素(只有一个),然后S=5,将S*N=50入栈
此时栈中元素为:100000000,1000,200,50
第9步==>处理“八”,N=8
直接入栈
此时栈中元素为:100000000,1000,200,50,8
第10步==>处理“万”,N=10000
弹出栈中比N小的元素(有四个),然后S=1258,将S*N=12580000入栈
此时栈中元素为:100000000,12580000
…………