java算法题原理整理
1. NC137 表达式求值。
先将中缀表达式变为后缀表达式,然后对后缀表达式进行求值。
1. 中缀表达式通过堆栈和队列转化为后缀表达式,遇到数字直接存入后缀表达式队列,遇到符号存入堆栈。在符号存入堆栈之前,先将符号与堆栈顶的符号元素进行优先级比较,如果堆栈顶的符号元素优先级大于或等于待插入的符号,就将堆栈顶的符号元素弹入队列中,否则就将当前的符号元素插入。若栈顶元素为(则例外,符号可直接压入堆栈中,直到碰到插入元素为),将堆栈中元素依次输出到队列中,直到碰到(,将(弹出且不需要再加入队列中。由此,可以从队列中获得后缀表达式。
2. 借助堆栈stack计算后缀表达式,依次遍历后缀表达式队列,如果是数字,则将其压入stack,如果遇到运算符,就从stack中弹出两个数字,后弹出的数字 运算符 先弹出的数字,并将结果重新存入stack中,当后缀表达式队列遍历完毕后,stack中存放的就是最后的结果。
***2. NC97 字符串出现次数的TopK问题
topN问题,可以使用快速排序对整体进行排序,也可以使用冒泡排序,只排前k个。但是,推荐使用大小为k的堆来解决,将数组中前k个数填充入小堆顶中, 将剩下的数与小堆顶进行比较,如果有比堆顶大的元素,就进行替换。
本题最让人觉得烦的是java中comparable接口的实现。必须依据算法的思想设计compareTo(),返回-1并不一定代表前面的元素小于后面的元素,也可能是为了从大到小排序而故意将结果

浙公网安备 33010602011771号