java算法题原理整理

1. NC137 表达式求值。

    先将中缀表达式变为后缀表达式,然后对后缀表达式进行求值。

    1. 中缀表达式通过堆栈和队列转化为后缀表达式,遇到数字直接存入后缀表达式队列,遇到符号存入堆栈。在符号存入堆栈之前,先将符号与堆栈顶的符号元素进行优先级比较,如果堆栈顶的符号元素优先级大于或等于待插入的符号,就将堆栈顶的符号元素弹入队列中,否则就将当前的符号元素插入。若栈顶元素为(则例外,符号可直接压入堆栈中,直到碰到插入元素为),将堆栈中元素依次输出到队列中,直到碰到(,将(弹出且不需要再加入队列中。由此,可以从队列中获得后缀表达式。

    2. 借助堆栈stack计算后缀表达式,依次遍历后缀表达式队列,如果是数字,则将其压入stack,如果遇到运算符,就从stack中弹出两个数字,后弹出的数字 运算符 先弹出的数字,并将结果重新存入stack中,当后缀表达式队列遍历完毕后,stack中存放的就是最后的结果。

 

***2. NC97 字符串出现次数的TopK问题

    topN问题,可以使用快速排序对整体进行排序,也可以使用冒泡排序,只排前k个。但是,推荐使用大小为k的堆来解决,将数组中前k个数填充入小堆顶中, 将剩下的数与小堆顶进行比较,如果有比堆顶大的元素,就进行替换。

    本题最让人觉得烦的是java中comparable接口的实现。必须依据算法的思想设计compareTo(),返回-1并不一定代表前面的元素小于后面的元素,也可能是为了从大到小排序而故意将结果

posted @ 2021-06-25 22:31  ybxmCnblogs  阅读(87)  评论(0)    收藏  举报