本文因为垃圾csdn标题字限制,标题写不好。本文想说一个算法,和我在CVTE的实习,我看到CVTE是一家什么公司。如果想要喷我的,可以留言,我不会理。如果想喷公司,可以在博客评论或发到我邮件lindexi_gd@163.com,我一般会理。
不使用数据结构反转栈
昨天有人问我一道题,我有一个栈,我不使用其他数据结构,不使用另一个栈,把这个栈里所有数据反转。
我一听就想说,脑残,这样会有这样的,如果可以使用另一个数组,就直接把数据弹出来,然后放进去,这样就好啦。
但是他说是笔试题,我就说什么渣公司。结果是CVTE。那么这道题还是厉害,因为需要用到递归,把递归的局部放数据,这道题出的好。因为是我们公司的。
我们用递归,用的方法是减治,因为递归就是下一次的函数做好了这一次前做好的事。
假如我有一个数据,需要使用递归,那么我就需使用完递归,输入下一个的时候,数据规模比上一次小,小多少都好,这样到最后一次就是处理很少的数据,或一个,这样就很好。
另一个就是函数处理了之前做的,然后我需要做本次的,这都是递归需要想的。
那么我们就开始想,我们有一个可以把栈反转的函数,这个函数不使用数据结构,那么我们需要递归使用,使用的时候输入比这一次少,这样就好。
开始我想的就是直接把一个局部变量存我们的栈的一个数据,递归,这样出栈完我们就使用局部压入,但是其实这样不对,因为我们这样就是让直接出栈完就压,没有变化。
那么我们想另一个方法,这个是我问了大神和我说,因为我是渣渣。
首先假如我们的数据是“12345”栈底从栈顶,我们从栈顶拿出放在我们的递归局部t,这时栈底到栈顶“1234”,我们函数可以反转栈,我们调用函数,反转,这时栈底到栈顶“4321”,我们用局部g拿栈顶,这时栈底到栈顶“432”,我们调用函数反转。栈底到栈顶“234”,我们把t压,“2345”反转,得到“5432”,把g压得到“54321”我们不使用数据结构反转栈。
这个方法一开始没有一个说是对的,其实这个方法是好的,因为我们使用我们的函数反转,下一次使用只有这一次的数据-1,也就是假如我们输入5个数据,第二次使用函数是输入4个,这样最后我们就有一个数据。
我们可以使用
public static void RecursionReverse(Stack<Puke> stack)
{
if (stack.Count == 0)
{
return;
}
Puke t = stack.Pop();
RecursionReverse(stack);
if (stack.Count == 0)
{
stack.Push(t);
}
else
{
Puke g = stack.Pop();
RecursionReverse(stack);
stack.Push(t);
RecursionReverse(stack);
stack.Push(g);
}
}
我们开始是判断我们的栈是不空,如果是我们就返回,然后我们使用t把我们栈拿出一个,然后递归,这时判断是不是t是最后一个,这样就是t出就是没有,没有的话我们就是对一个反转,反转还是他,所以我们就把t放入。放入我们就不需要继续。如果t后还有,我们就用g拿出栈的一个,反转,然后把t压,反转,压入g,结束。
import java.util.Stack ;
public class HelloWorld{
public static void main(String []args){
Stack<Puke> stack=new Stack<Puke>();
Puke puke=new Puke("1");
stack.push(puke);
puke=new Puke("2");
stack.push(puke);
puke=new Puke("3");
stack.push(puke);
puke=new Puke("4");
stack.push(puke);
puke=new Puke("5");
stack.push(puke);
recursionReverse(stack);
String str="";
while(!stack.empty()){
str+=stack.pop().paimian;
}
System.out.println(str);
}
public static void recursionReverse(Stack<Puke> stack){
if(stack.empty()){
return;
}
Puke t=stack.pop();
recursionReverse(stack);
if(stack.empty()){
stack.push(t);
}
else{
Puke g=stack.pop();
recursionReverse(stack);
stack.push(t);
recursionReverse(stack);
stack.push(g);
}
}
static class Puke{
public Puke(String paimian){
this.paimian=paimian;
}
public String paimian;
}
}
我们在工程少点用,因为我用了100个Puke就算了10分钟
CVTE是什么公司
CVTE是一家很有争议的公司,我觉得cvte还好,本文总体是说好的。我会说我看到的,有些是好的,有些是差的
上个月很兴奋去公司实习,其实因为我投的公司不是太远就是比不过CVTE。
开始从网上找到都是差评,基本上就是公司压力大,加班时间多。开始有点不想去,不过很早就听过公司,还有我的小伙伴在里面,应该还是很好的。
刚进去公司开始的时候居然是培训,听到培训以为是学技术,感觉不喜欢,结果培训的内容是吃喝玩+我也不知道怎么,感觉很诡异但是感觉不错。
培训时讲的公司的有点多,这个让我觉得不太好,因为说道自由,这个在网上争议比较多,其实因为自由是很抽象的,我不觉得是。自由在公司老大觉得:可以自由上下班,可以随便说话,言论自由,工资不是主管定。听到言论自由我觉得这一点是不成立的,于是最后作死试了,好像还是可以言论自由。
吃的开始进去是请大家吃一顿大的,记得:红肉红酒。
服务员是我们的前辈,那时我就在想如果我正式入职,可以选择我参不参加公司活动,如果可以不参加,那么是自由
然后开始培训有如何吃东西,如何喝酒,各种酒,现实给我们吃,然后还去广州玩,去吃美食节,食堂近五星自助餐。
住的是差不多酒店,很好。开始的培训感觉没什么用,但是在现在觉得,有哪个公司蛋疼培训这些。
感觉公司不好的就是吹的还是有点多,人均华为这个我不说啦,反正没什么,有工资就好,不过销售小伙伴留下不多。
第二周就去部门,我见到了我小伙伴,开始要接公司的项目,一开始听到是考核项目,一下子就不想了,但是小伙伴告诉我,这是公司现实要用的,于是我就开始。
我接到项目是Nuget管理,很简单的,开始就在官方找,然后直接使用官方的,各种,但是官方骗我,好在把核心功能砍了,我就完成了。
完成了自己项目就去我另外小伙伴项目,因为我感觉那个项目很简单,客户端大概三天就做完,但是我不能做完我小伙伴就没得考核项目,所以只好帮他做传输层。
传输层我开始用了我的协议,但是想着这个是docs.supersocket.net,我一组的有师兄,他做后台,很厉害,我三天改协议,他都做了,还不打我。
公司部门小伙伴也很有时间,不是一天都在打码,有很多时间是在讨论,在学习。本来以为加班会很多,我们部门一直按规划,显得不会那么忙,一天在7点差不多就可以走一半的人,我觉得一天工作10个钟还是可以,互联网哪有95。
但是我们是工作到周六早上。
加班时间没有那么多,一般加班得到的代码也是很差,没多少公司代码是在加班写,因为加班写的一小时需要用十多小时去改。
公司很多讨论,一般中午有时间讲课,是里面的大神。
旅游也好多,一年三次。好奇cvte福利好,其实不是,cvte给工资只有13月,而腾讯那些给16,所以不要以为公司福利好,其实福利没有几万,工资少了3个月所以其实和别的公司差不多。
不要想着公司是不是差,其实自己有多少能力要知道,其实我是渣渣,能力还没有一年工作经验,不想去看面试题,所以应该是进不了垃圾tx,我想着可能进不了微软谷歌甲骨文bat我就去cvte,我觉得这公司还好,去了大公司可能去做螺丝钉,可能有快速发展,去哪里只要觉得现在好就好,不需要想太久。
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
分享到:
相关推荐
数据结构是计算机科学中的核心概念,它涉及到如何高效地存储和操作数据。栈与递归是其中两个重要的概念,它们在编程中有着广泛的应用。本文将深入探讨这两个主题,包括它们的基本原理、工作机制以及如何解决实际问题...
理解递归遍历后,非递归遍历的关键在于使用额外的数据结构(如栈或队列)来跟踪当前的遍历状态。非递归遍历的优势在于它避免了函数调用栈的深度限制,对于非常深的树,递归可能会导致栈溢出。 在实际编程中,根据...
总结一下,通过使用数据结构中的栈,我们可以将效率较低的递归函数转换为非递归函数,提高计算效率,减少内存消耗,防止堆栈溢出。在实际编程中,尤其是在处理大数据量或需要高效运行的算法时,这样的优化是非常重要...
数据结构:栈与递归--含分治与回溯.ppt
在IT领域,数据结构是计算机科学中的核心概念,它研究如何高效地组织和存储数据,以便于执行各种操作。递归则是编程中的一个重要技术,它通过函数或过程调用自身来解决问题。本实验主题“数据结构实验-递归”旨在...
在IT领域,栈递归是一种常见的编程技巧,它利用了计算机内存中的栈数据结构来实现函数调用的递归过程。栈是一种后进先出(LIFO)的数据结构,非常适合处理这种逆序操作,比如递归。在这个"栈递归.rar"压缩包中,包含...
数据结构中的栈与递归是计算机科学中...总结起来,栈与递归是计算机科学中不可或缺的概念,它们在算法设计、数据结构和程序设计中扮演着重要角色。理解并熟练运用它们,对于提升编程能力和解决复杂问题的能力至关重要。
在计算机科学和软件工程中,链表被广泛用于实现列表、栈、队列、图、树等数据结构。在给出的文件中,涉及到了链表在实现加法、翻转、划分、去重等操作时的应用,以及这些操作与栈和递归算法的关联。 首先,链表表示...
数据结构课程中的递归是一个重要的概念,它在计算机科学中占据着核心地位,尤其是在算法设计和程序编写中。递归是指一个函数或过程在执行过程中直接或间接地调用自身来解决问题的方法。递归通常涉及分治策略,将大...
非递归遍历二叉树是一种不依赖递归函数来访问树的所有节点的方法,它通常通过栈或队列等数据结构来实现。下面我们将详细探讨非递归遍历二叉树的先序、中序和后序策略。 先序遍历是二叉树遍历的一种方法,其顺序为:...
并不是所有的递归过程在转换成非递归过程时都需要使用栈,特别是没有使用局部变量的递归过程,该说法错误。 12. **队列的基本性质** 队列是一种先进先出(FIFO)的线性结构,而不是先进后出,因此该说法错误。 13...
数据结构 - 栈与递归 数据结构是计算机科学中的一门重要课程,涉及到对数据的存储、操作和管理。在数据结构中,有多种不同的数据结构,每种数据结构都有其特点和应用场景。本文将围绕栈和递归这两种重要的数据结构...
总结来说,栈是计算机科学中不可或缺的数据结构,它具有独特的逻辑和存储结构,且在计算机科学的多个领域中具有广泛的应用。教师在教授栈时,应该注重理论与实践相结合的教学方法,并通过多种手段激发学生的学习兴趣...
在编程领域,栈和递归是两种非常重要的概念,它们在数据结构和算法中占据着核心地位。在本文中,我们将深入探讨这两种方法,并通过一个实际的案例——遍历计算机磁盘文件,来阐述它们在异步执行环境下的应用。 首先...
本文将深入探讨C#中的数据结构,特别是排序、栈与栈的应用、树和二叉树以及递归等核心概念,并通过实例来加深理解。 首先,我们来看排序。排序是计算机科学中最基本的操作之一,它涉及到对一组数据按照特定顺序进行...
总的来说,迷宫路径求解涉及核心的计算机科学概念,如数据结构(链式栈)、算法(DFS)、递归,以及程序设计。通过理解这些知识点,开发者能够解决更复杂的问题,比如网络路由、图形遍历等。在实际项目中,选择递归...
非递归实现的基本思想是将递归调用转化为循环,并使用数据结构(如堆栈)存储中间结果,避免了递归带来的调用栈溢出问题。 非递归实现的步骤大致如下: 1. 初始化一个堆栈,用于保存待处理的阿克曼函数参数对`(m, ...
5. **自定义栈的实现**:除了使用STL的`stack`,还可以自定义栈,例如使用动态数组或链表作为底层数据结构。自定义栈的优势在于可以根据需求定制栈的行为,如增加新的操作或优化性能。 综上所述,这个压缩包提供的...
数据结构与算法是计算机科学的核心领域,而递归则是解决复杂问题的一种强大工具。递归在数据结构中的应用广泛,特别是在树形结构、图结构以及排序算法中。本篇文章将深入探讨递归的基本概念,通过C语言实现递归函数...
在计算机科学中,数据结构和算法是编程的基础,而递归是解决复杂问题的重要方法之一。递归是一种在函数或程序中调用自身的技术,它通过简化问题来达到求解的目的。递归通常与分治策略相结合,将大问题分解为小的相似...