实习终于结束了,好久没有总结编程问题了,因为最近真是没怎么写程序。
今天做华为的火车进站问题,这是一道看似像全排列,其实是栈的问题。
看了一些网上的写法,掌握了一种思路,也是种投机取巧的方法:
先产生序列的全排列,然后再全排列里面去除不可能的出栈顺序。
1.全排列很好产生,用stl里面的next_permutation(begin,end)
2.判断这个排列是不是正确的出栈顺序。
就第2点:
1.给一种进栈顺序加上序号,比如4,2,8这么进栈,则4为0,2为1,8为2,以此类推。只是想表明一个顺序,4在前面进栈,然后是2最后是8
2.抓住出栈的规则,比如入栈序列:1 2 3 4 5 6,出栈序列,4,3,5,2,6,1。
4先出栈,则4前面的321肯定在栈内,必然是按顺序出栈的(中间可能夹杂其他元素)。3出栈,前面的21肯定也是这样。
所以可以总结一句话:
出栈的每一个元素之后的所有下标比它小的元素,这些元素的下标一定是有序的!
下标:之前所说的序号。就是入栈顺序。
举例来看,4,3,5,2,6,1。4之后的3 2 1有序,3后面的2 1有序,5 后面的 2 1有序,2后面的1有序,6后面的1有序。
所以,这样就简单了。代码就不上了,这是个投机取巧的方法,今天太困了,脑子转不过来,递归写不了。
时间: 2024-11-03 21:38:18