- 博客(56)
- 资源 (2)
- 收藏
- 关注
原创 任意长度的高精度大整数加法
方法:这里用了数据结构栈,实际上栈更方便实现高精度加法。步骤:1、第一个数据加数按输入顺序(高位到低位)入栈1。此时栈顶为最低位 2、第二个数据加数按输入顺序(高位到低位)入栈2。此时栈顶为最低位 3、将栈1、栈2均pop出栈顶做加法,并考虑进位,结果入栈3,这时栈3正好是低位入栈。 4、处理多余的栈1、栈2。
2012-06-22 17:37:45 1993
原创 KMP算法大总结
在介绍KMP算法之前,先介绍一下BF算法。一.BF算法 BF算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串P的第一个字符进行匹配,若相等,则继续比较S的第二个字符和P的第二个字符;若不相等,则比较S的第二个字符和P的第一个字符,依次比较下去,直到得出最后的匹配结果。 举例说明: S: ababcababa P: ababa
2012-06-23 19:55:32 486
原创 阿里云2011.9.17招聘会笔试题
1、 堆和栈的区别?答:1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 3、栈是向下增长的,堆是向上增长的。(可以参考
2012-06-22 17:31:38 1314
原创 动态规划解决求数组中最长递增子序列长度,并能够打印出增长的序列
解法一 根据无后效性的定义我们知道,将各阶段按照一定的次序排列好之后,对于某个给定阶段的状态来说,它以前各阶段的状态无法直接影响它未来的决策,而只能间接地通过当前状态来影响。换句话说,每个状态都是过去历史的一个完整总结。 同样地,仍以序列1,-1,2,-3,4,-5,6,-7中为例,我们在找到4之后,并不关心4之前的两个值具体是怎样,因为它对找到6并没有直接影响。因此,
2012-06-22 17:16:49 1316
原创 百度笔试题:malloc/free与new/delete的区别
相同点:都可用于申请动态内存和释放内存不同点:(1)操作对象有所不同。malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符。对于非内部数据类的对象而言,光用maloc/free 无法满足动态对象的要求。对象在创建的同时要自动执行构造函数, 对象消亡之前要自动执行析构函数。由于malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不
2012-06-22 15:40:45 584
原创 C++中引用传递与指针传递区别(进一步整理)
从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。在C++中,指针和引用经常用于函数的参数传递,然而,指针传递参数和引用传
2012-06-22 15:34:58 419
原创 迅雷2012校园招聘笔试题 .
1、微机中1K字节表示的二进制位数是()解:1个自己表示8为所以1k字节能够表示的:2^10*8=2^132、设C语言中,一个int型数据在内存中占2个字节,则unsigned int 型数据的取值范围为()A、0--- 255 B、0--- 32767 C、0--- 65535 D、0--- 2147483647解:这是个典型的题目,对于有符号的int表示
2012-06-22 14:51:38 634
原创 一个字符串中去点重复的字符,同样采用快慢指针。
比如char str[]="abcdacd";-->str="abcd";思路:①采用26个字母的映射表②采用快慢指针进行删除操作代码:// getPureStr.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include using namespace std;void getPureStr(char* str)
2012-06-22 10:42:41 1037
原创 字符串移位包含问题--编程之美
题目:给定两个字符串s1和s2,要求判定s2是否能够被通过s1做循环移位得到的字符串包含,比如:s1="AABCD",s2="CDAA",返回true,给定s1="ABCD",s2=“ACBD”返回false 解法:可以对循环移位后的结果进行分析以s1="ABCD"为例可知,s1做循环移位得到的所以字符串都是s1s1的字串,如果s2可以由s1做循环移位得到,那么s2一定也是s1s1的字
2012-06-21 20:09:04 167
原创 彻底理解堆排序
堆排序过程堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。既然是堆排序,自然需要先建立一个堆,而建堆的核心内容是调整堆,使二叉树满足堆的定义(每个节点的值都不大于其父节点的值)。调堆的过程应该从最后一个非叶子节点开始,假设
2012-06-19 23:06:34 4228
原创 智能手机知名浏览器面试题目---已知树的前序遍历和中序遍历,求树的后序遍历结果
根据前序和中序序列或后序和中序序列可以唯一确定一棵二叉树所以必须要知道:必须知道中序遍历。根据前序和中序序列或后序和中序序列可以唯一确定一棵二叉树。例:若已知一棵二叉树的前序序列和中序序列分别为: 前序: A B D E C F G H 中序: D B E A G F H C 试画出这棵二叉树的逻辑结构示意图。 思路就是以上的思路,具体代码如下
2012-06-19 20:35:53 2216 1
原创 两个数和多个数的异或总结
1,百度那个找出数组中那两个只出现一次的两个数用到的思想就是分组然后比如4,4,5 那么4^5^4=5,就是说两个相同的数和2.同理可以用异或实现数字a,b的交换,a=a^b -->b=a^b-->b=a^b^b=a-->b现在就是aa=a^b-->a=a^b^a-=b->a现在就是b,ok上面的不用中间变量实现交换终于明白了,高兴ing...
2012-06-18 23:10:51 3111
原创 一个百度的面试题目
题目:一个数组中有2个数只出现了一次,其他的数都出现了两次,写一个算法找出这两个只出现一次的数分析:该题目可以通过异或完成,先让我举一个例子4:0100^5:0101------------- 1: 0001^5:0101-------------4:0100上面的例子说明4^5^5=4;同理4^5^4=5int find_first_1(int n){
2012-06-18 22:48:53 667
原创 给一个很大的数组,里面有两个数只出现过一次,其他数都出现过两次,把这两个数找出来
如果成对出现的都是相近的位置上,那么久很好做了可以用如下代码找到那个是只出现一次//下面这个代码其实是找到数组中出现一次的次数// YiHuoFind.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include using namespace std;int find(int* array, int size){ int
2012-06-18 19:33:26 2647 4
原创 从Trie树(字典树)谈到后缀树
作者:July、yansha。出处:http://blog.csdn.net/v_JULY_v 。 引言 常关注本blog的读者朋友想必看过此篇文章:从B树、B+树、B*树谈到R 树,这次,咱们来讲另外两种树:Tire树与后缀树。不过,在此之前,先来看两个问题。 第一个问题: 一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词,请给出思想,
2012-06-17 22:35:36 1427
原创 求某个数的整数次方
题目:实现函数double Power(double base, int exponent),求base的exponent次方。不需要考虑溢出。分析:在开始写“主要”的功能代码之前,别忘了对输入数据base和exponent进行检查!exponent是int类型,故有正负之分,为正时,比较简单;为负时,要取分数的,别忘了;还有为0的情况,当base不为0时,任何非0数的0次方等于0(没错吧?忘
2012-06-16 10:51:27 939
原创 颠倒栈 {5,4,3,2,1}-->{1,2,3,4,5}
题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。只消两个递归即可,直接看代码吧!// reverseStack2.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include using namespace std;v
2012-06-16 10:28:48 1072
原创 C 语言实现函数void*memmove(void*dest,constvoid*src,size_tn)。memmove 函数的功能是拷贝
C 语言实现函数void*memmove(void*dest,constvoid*src,size_tn)。memmove 函数的功能是拷贝 src 所指的内存内容前n 个字节到dest 所指的地址上。
2012-06-16 08:21:07 477
原创 O(1)时间删除链表结点
题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。思路是将需要删除节点的值变为他的下一结点,然后删除它的下一结点,这样就像是变相删除了该节点。链表结点的定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};函数的声明如下:void DeleteNode(L
2012-06-15 23:08:46 123
原创 求链表中倒数第K个节点
求链表中倒数第K个节点,思路很简单我们在遍历时维持两个指针,第一个指针从链表的头指针开始遍历,在第k-1步之前,第二个指针保持不动;在第k-1步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1,当第一个(走在前面的)指针到达链表的尾结点时,第二个指针(走在后面的)指针正好是倒数第k个结点。实现代码如下:基本思路:(1)将pSlow和pFast同时指向链表的头
2012-06-15 23:05:44 2922 1
原创 判断两个单链表是否相交,并找到交点
思路:①首先分别求出两个链表的长度之差a②让长度长的链表先走a下③然后两个链表一起走,如果相等,并且都不为空,那么就说明两个链表是相交的。代码实现如下:// IsLinkMeet1.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include using namespace std;typedef struct node
2012-06-15 20:48:20 1000
原创 判断单链表是否存在环,判断两个链表是否相交问题详解
有一个单链表,其中可能有一个环,也就是某个节点的next指向的是链表中在它之前的节点,这样在链表的尾部形成一环。问题:1、如何判断一个链表是不是这类链表?2、如果链表为存在环,如何找到环的入口点?解答:一、判断链表是否存在环,办法为:设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fas
2012-06-15 18:47:10 668
原创 将整数转换为字符串和将字符串转换为整数
(一)将字符串转换为整数1.设置两个标记为:①是否为数字②是否是负数bool validInput = false; //检测是否是有效数字 bool IsMinus = false; //检测是否是负数(二)将整数转换为字符串注意:①如果是正数,直接每次取出个位数,放在数组中,然后颠倒数组②如果是负数,先转换为正数,直接每次取出个位数,放在数组中颠倒,然后再在第一个a[
2012-06-14 23:32:05 887
原创 汉诺塔问题递归解法
汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求打印移动的步骤。汉诺塔问题这个问题在盘子比较多的情况下,很难直接写出移动步骤。我们可以先分析
2012-06-13 22:52:22 3109
原创 一道很有典型的面试题目
对字符串进行sizeof操作的时候,会把字符串的结束符“\0”计算进去的,进行strlen操作求字符串的长度的时候,不计算\0的。数组作为函数参数传递的时候,已经退化为指针了,Func函数的参数str_arg只是表示一个指针,那个100不起任何作用的。 下面程序的输出结果为多少?[cpp] view plaincopyprint?void Func(c
2012-06-13 18:22:19 455
原创 栈的push、pop序列是否正确
题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,push 5,pop,pop,
2012-06-12 21:07:17 1137 1
原创 从数列1,2,3.......n 中 随意取几个数,使其和等于 m
其实是个背包问题。[cpp] view plaincopyprint?void FindSum(int sum, int n)//1到n和为m的所有组合 { static vectorint> l; if(n return; if(sum>n) { l.push_back(n);
2012-06-12 20:01:46 553
原创 从数列1,2,3.......n 中 随意取几个数,使其和等于 m
其实是个背包问题。[cpp] view plaincopyprint?void FindSum(int sum, int n)//1到n和为m的所有组合 { static vectorint> l; if(n return; if(sum>n) { l.push_back(n);
2012-06-12 20:01:17 673
原创 全组合(可包含重复字符)
前面写了篇博客,能够实现abc的组合,但是对于去重却没有考虑,下面实现全组合的去重算法: 利用链表保存结果,去除重复的串。[cpp] view plaincopyprint?#include #include using namespace std; #include using namespace std; typedef
2012-06-12 19:58:14 606
原创 颠倒栈
题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5处在栈顶。分析:乍一看到这道题目,第一反应是把栈里的所有元素逐一pop出来,放到一个数组里,然后在数组里颠倒所有元素,最后把数组中的所有元素逐一push进入栈。这时栈也就颠倒过来了。颠倒一个数组是一件很容易的事情。不过这种思路需要显示分配一个长度为O(n)的数组,而且
2012-06-12 19:55:33 443
原创 C++中的vector简单使用范例 (有点像java里面的集合的操作)
首先是vector的声明:#include using namespace std; // 在这里声明...vector i;... 或者#include ...std::vector i; // 在这里显式声明 使用如下: vector result;for(;iter { cout }
2012-06-12 19:49:39 712
原创 字符串的全排列和组合算法
全排列在笔试面试中很热门,因为它难度适中,既可以考察递归实现,又能进一步考察非递归的实现,便于区分出考生的水平。所以在百度和迅雷的校园招聘以及程序员和软件设计师的考试中都考到了,因此本文对全排列作下总结帮助大家更好的学习和理解。对本文有任何补充之处,欢迎大家指出。首先来看看题目是如何要求的(百度迅雷校招笔试题)。一、字符串的排列用C++写一个函数, 如 Foo(const char *
2012-06-12 19:25:32 3556
原创 字符串的全排列和组合算法
全排列在笔试面试中很热门,因为它难度适中,既可以考察递归实现,又能进一步考察非递归的实现,便于区分出考生的水平。所以在百度和迅雷的校园招聘以及程序员和软件设计师的考试中都考到了,因此本文对全排列作下总结帮助大家更好的学习和理解。对本文有任何补充之处,欢迎大家指出。首先来看看题目是如何要求的(百度迅雷校招笔试题)。一、字符串的排列用C++写一个函数, 如 Foo(const char *
2012-06-12 19:22:19 641
原创 腾讯实习生笔试题目(一)
1、计算表达式x6+4x4+2x3+x+1最少需要做()次乘法A、3 B、4 C、5 D、6第一次乘法:x^2,第二次乘法:x^4=x^2 * x^2,第三次乘法:原式=x^2 * (x^4+4x^2+2x)+x+1,每一项的系数可以使用加法来实现。。2、给定3个int类型的正
2012-06-12 18:24:38 2739 2
原创 给出一个单向链表的头指针pHead,判断链表中是否有环,若存在,则求出进入环中的第一个节点。
4、给出一个单向链表的头指针pHead,判断链表中是否有环,若存在,则求出进入环中的第一个节点。 示意图如下:红色虚线框中的节点为待求节点。首先使用第2个题目中的快、慢指针来判断链表是否存在环,若不存在结束。若链表中存在环,我们从链表头、与两个指针的相遇点分别设一个指针,每次各走一步,两个指针必定相遇,且相遇的第一个点为环的入口点。
2012-06-10 19:17:59 607
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人