算法
文章平均质量分 59
无敌的成长日记
这个作者很懒,什么都没留下…
展开
-
从无到有构建红黑树
红黑树是60年代中期计算机科学界找寻一种算法复杂度稳定,容易实现的数据存储算法的产物。在优先级队列、字典等实用领域都有广泛地应用,更是70年代提出的关系数据库模型--B树的鼻祖。在Linux kernel中,高精度定时器也工作在红黑树之上。为便于初学者掌握其基本算法,本文一步一步地演示了红黑树的创建过程。首先回顾一下红黑树的基本性质: 1. 红黑树本质上是一个二叉查找树(BST),但转载 2013-02-27 15:41:27 · 6828 阅读 · 3 评论 -
泛型编程之3
题:Below is usual way we find one element in an array: In this case we have to bear the knowledge of value type "int", the size of array, even the existence of an array. Would you re-write it using t原创 2013-07-02 14:51:01 · 999 阅读 · 0 评论 -
泛型编程
题:何为泛型编程?【美国某著名CPU生产公司面试题】答案:STL代表用一致的方式编程是可能的。实际上,它完全不同于我们过去看到的C++编程,也完全不同于大多数教科书里所描述的方式。STL并不是试图用C++编程,只是试图找到一种正确的方式来处理软件,寻找一种可以表达我的想法的语言而已。换句话说,我知道我想说什么。我能用C++说,我能用Ada说,我能用Scheme说。我可以让自己去适应语言,但原创 2013-07-02 10:45:21 · 681 阅读 · 0 评论 -
泛型编程之2
题:解释一下什么是泛型编程,泛型编程和C++及STL的关系是什么?并且,你是怎么在C++环境里进行泛型编程的?【美国某著名CPU生产公司面试题】答案:泛型编程是一种基于发现高效率算法的最抽象表示的编程方法。也就是说,以算法为起点并寻找能使其工作且有效率工作的最一般的必要条件集。令人惊讶的是,很多不同的算法都需要相同的必要条件集,并且这些必要条件有多种不同的实现方式。类似的事实在数学里面原创 2013-07-02 10:59:31 · 884 阅读 · 0 评论 -
向量容器2
题3:以下代码有什么问题?如何修改?【中国某著名综合软件公司2005年面试题】// P96_example3.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include #include void print(std::vector);int _tmain原创 2013-07-02 10:37:10 · 925 阅读 · 0 评论 -
向量容器
题:介绍一下STL和包容器,如何实现?举例实现vector。【美国某著名移动通信企业面试题】答案:C++的一个新特性就是采用了标准模版库(STL)。所有主要编译器销售商现在都把标准模板库作为编译器的一部分进行提供。标准模板库是一个基于模版的容器类,包括链表、列表、队列和堆栈。标准模版库还包含许多常用的算法,包括排序和查找。标准模板库的目的是提供对常用需求重新开发的一种替代方法。标准原创 2013-07-01 09:57:08 · 1726 阅读 · 0 评论 -
概率题
题:Please write out the program output.(写出下面程序的运行结果。)【德国某著名软件咨询企业2005年10月面试题】// P92_example1.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include #define原创 2013-06-28 11:32:14 · 1313 阅读 · 1 评论 -
螺旋队列问题2
题:如矩阵1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9 找出规律,并打印出一个NxN的矩阵,规律就是从首坐标开始顺时针一次增大。解析:依次:按左-->右,上-->下,右-->左,下-->上的原创 2013-06-27 15:23:34 · 1657 阅读 · 2 评论 -
螺旋队列算法分析
螺旋队列的样子如下图:两大规律:1、螺旋规律2、奇数(圈数,或X轴正坐标)平方规律(紫线) 问题描述: 设1的坐标是(0,0),x方向向右为正,y方向向下为正,例如,7的坐标为(-1,-1),2的坐标为(1,0)。编程实现输入任意一点坐标(x,y),输出所对应的数字! 问题解决:从紫线突破。从图中不难转载 2013-06-26 15:22:08 · 769 阅读 · 0 评论 -
模版——容器,迭代器
题:试用多态实现线性表(队列、串、堆栈),要求具备线性表的基本操作:插入、删除、测长等。【美国著名软件企业GS公司2007年11月面试题】解析:队列、串、堆栈都可以实现push、pop、测长等操作。现在要求用多态去实现,就要建立一个线性表的共性模版,来实现以上的功能。答案:程序源代码与解释如下// P101_example2.cpp : Defines the entry po原创 2013-07-04 14:55:09 · 1192 阅读 · 0 评论 -
单链表之插入删除结点
题:编程实现单链表删除结点。【美国某著名分析软件公司面试题】解析:如果删除的是头结点,如下图所示。则把head指针指向头结点的下一个结点,同时free P1结点,如下图所示。。如果删除的是中间结点,如下图所示。则用P2的next指向P1的next同时,free P1,如下图所示。。答案:完整代码如下:// P167_example1.cpp原创 2013-07-30 15:02:57 · 2626 阅读 · 0 评论 -
判定一棵二叉树是否是二叉搜索树
问题给定一棵二叉树,判定该二叉树是否是二叉搜索树(Binary Search Tree)?解法1:暴力搜索首先说明一下二叉树和二叉搜索树的区别。二叉树指这样的树结构,它的每个结点的孩子数目最多为2个;二叉搜索树是一种二叉树,但是它有附加的一些约束条件,这些约束条件必须对每个结点都成立:结点node的左子树所有结点的值都小于node的值。 结点node的右子树所有结点转载 2013-10-17 23:47:52 · 1030 阅读 · 0 评论 -
百度2014校园招聘-研发工程师笔试题(济南站)
一,简答题(30分)1,当前计算机系统一般会采用层次结构存储数据,请介绍下典型计算机存储系统一般分为哪几个层次,为什么采用分层存储数据能有效提高程序的执行效率?(10分) 所谓存储系统的层次结构,就是把各种不同存储容量、存取速度和价格的存储器按层次结构组成多层存储器,并通过管理软件和辅助硬件有机组合成统一的整体,使所存放的程序和数据按层次分布在各种存储器中。目前,在计算机系统中通转载 2013-10-14 22:03:42 · 1355 阅读 · 0 评论 -
广联达软件开发笔试题
1.[编程]给定一个整数,获得它的逆序数,如整数87231,逆序后为13278// nixushu.cpp : Defines the entry point for the console application.////思路是先转成字符串再操作#include "stdafx.h"#include #include //返回值为计算出的逆序数int fun(int nu原创 2013-09-20 18:41:44 · 7195 阅读 · 2 评论 -
字符串中相同且长度最长的字符串
题目出自:《程序员面试宝典》(第三版) P226页 面试例题2 输入一行字符串,找出其中出现的相同且长度最长的字符串,输出它及首字符的位置。例如“yyabcdabjcabceg”,输出结果应该为abc和3。 这个题目存在一个歧义,例如如果测试字符串为aaaaaa,我一开始以为结果是长度为3的aaa,原来正确答案是长度为5的aaaaa。即2个等长的子串可以有转载 2013-08-21 21:57:40 · 4599 阅读 · 0 评论 -
写一个方法,输入任意一个整数,返回它的阶乘
// jiecheng.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include //递归实现long fac(int n){ long f; if(n == 0) f = 1; else f = n*fac(n-1); return f;}//非原创 2013-08-08 21:12:07 · 4066 阅读 · 0 评论 -
二分查找算法
二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为: 1.第一步查找中间元素,即5,由于5 2.寻找{6, 7, 8,转载 2013-08-08 16:07:27 · 822 阅读 · 0 评论 -
单链表之建立/测长/打印
题:编程实现一个单链表的建立/测长/打印。【日本某著名家电/通信/IT企业面试题】答案:完整代码如下:// P167_example1.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include #include #include #include type原创 2013-07-30 10:52:51 · 2423 阅读 · 2 评论 -
面向对象之构造函数和析构函数之五
题:请看下面一段程序:// P110_example5.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include #include #include class B{private: int data;public: B() { std::cou原创 2013-07-11 10:18:16 · 1091 阅读 · 0 评论 -
面向对象之拷贝构造函数和赋值函数之一
题:编写类String的构造函数、析构函数和赋值函数。【中国某著名综合软件公司2005年面试题】答案:已知类String的原型为:class String{public: //普通构造函数 String(const char *str = NULL); //拷贝构造函数 String(const String &other); //析构函数 ~String(void);原创 2013-07-11 11:31:11 · 880 阅读 · 0 评论 -
经典排序算法——快速排序
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速转载 2013-05-19 20:40:31 · 637 阅读 · 0 评论 -
经典排序算法——快速排序
快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮转载 2013-05-02 16:56:50 · 519 阅读 · 0 评论 -
经典排序算法——冒泡排序Bubble sort
原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子例子为从小到大排序,原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 |第一趟排序(外循环)第一次两两比较6 > 2交换(内循环)转载 2013-04-25 17:19:22 · 583 阅读 · 0 评论 -
程序员面试100题之五:二叉树两个结点的最低共同父结点
题目:二叉树的结点定义如下: struct TreeNode { int m_nvalue; TreeNode* m_pLeft; TreeNode* m_pRight;};输入二叉树中的两个结点,输出这两个结点在数中最低的共同父结点。转载 2013-04-22 21:28:04 · 665 阅读 · 0 评论 -
程序员面试100题之四:求1+2+...+n
题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。 分析:这道题没有多少实际意义,因为在软件开发中不会有这么变态的限制。但这道题却能有效地考查发散思维能力,而发散思维能力能反映出对编程相关技术理解的深刻程度。 通常求1+2+…+n 除了用公式n(n+1)/2之外,无转载 2013-04-22 18:56:20 · 602 阅读 · 0 评论 -
程序员面试100题之三:不用+、-、×、÷数字运算符做加法
题目:写一个函数,求两个整数的之和,要求在函数体内不得使用+、-、×、÷。 分析:这又是一道考察发散思维的很有意思的题目。当我们习以为常的东西被限制使用的时候,如何突破常规去思考,就是解决这个问题的关键所在。 看到的这个题目,我的第一反应是傻眼了,四则运算都不能用,那还能用什么啊?可是问题总是要解决的,只能打开思路去思考各种可能性。首先我们可以分析人们是转载 2013-04-10 21:40:21 · 651 阅读 · 0 评论 -
程序员面试100题之二:跳台阶问题(变态跳台阶)
题目1:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。分析:这道题最近经常出现,包括MicroStrategy等比较重视算法的公司都曾先后选用过个这道题作为面试题或者笔试题。首先我们考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级;另外一种就是一次跳2级。转载 2013-04-09 21:48:14 · 709 阅读 · 0 评论 -
红黑树C++实现
红黑树的定义:一棵二叉查找树如果满足下面的红黑性质,则为一棵红黑树:1)每个节点或是红的,或是黑的。2)根节点是黑的。3)每个叶节点(NIL)是黑节点。4)如果一个节点是红的,则它的两个儿子都是黑的。5)对每个节点,从该节点到其子孙节点的所有路径上包含相同节点数目的黑节点。 C++代码实现:BRTreeNode.h#ifndef BRTREENODE_H_I转载 2013-02-27 19:07:40 · 806 阅读 · 0 评论 -
程序员面试100题之六:最长公共子串
题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。 例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。转载 2013-05-07 16:00:18 · 655 阅读 · 0 评论 -
循环与数组问题3
题3:有两个等长数组A、B,所含元素相同,但顺序不同,只能取得A数组某值和B数组某值进行比较,比较结果为大于、小于或等于,但是不能取得同一数组A或B中的两个数进行比较。写一个算法实现正确的匹配(即A数组中某值与B中某值等值)【英国著名图形图像公司A2007年4月校园招聘面试题】解析:算法:循环加判断可以很快地解决这个问题。算法分析:假设两个数组A[10]、B[10]。将A.0与原创 2013-06-18 15:26:40 · 908 阅读 · 0 评论 -
循环与数组问题4
题4、The following C++ code tries to count occurence of each ASCII charcaterin given string and finally print out the occurency numbers.(下面C++代码用来统计每个ASCII字符的出现次数,最后给出出现数值。)#include #include voi原创 2013-06-25 10:21:09 · 1299 阅读 · 0 评论 -
面向对象之构造函数和析构函数之一
题:MFC类库中,CObject类的重要性不言自明。在CObject的定义中,我们看到一个有趣的现象,即CObject的析构函数是虚拟的。为什么MFC的编写者认为virtual destructors are necessary(虚拟的析构函数是必须的)?【美国某著名移动通信企业2004年面试题】解析:我们可以先构造一个类如下:class CBase{ public: ~CBase原创 2013-07-10 10:51:11 · 915 阅读 · 0 评论 -
面向对象之构造函数和析构函数之二
题:析构函数可以为virtual型,构造函数则不能。那么为什么构造函数不能为虚呢?【美国某著名移动通信企业2004年面试题】答案:虚函数采用一种虚调用的办法。虚调用是一种可以在只有部分信息的情况下工作的机制,特别允许我们调用一个只知道接口而不知道其准确对象类型的函数。但是如果要创建一个对象,你势必要知道对象的准确类型,因此构造函数不能为虚。原创 2013-07-10 11:00:20 · 671 阅读 · 0 评论 -
面向对象之构造函数和析构函数之三
题:如果虚函数是非常有效的,我们是否可以把每个函数都声明为虚函数?答案:不行,这是因为虚函数是有代价的:由于每个虚函数的对象都必须维护一个v表,因此在使用虚函数的时候都会产生一个系统开销。如果仅是一个很小的类,且不想派生其他类,那么根本没必要使用虚函数。原创 2013-07-10 11:03:27 · 709 阅读 · 0 评论 -
面向对象之成员变量之三
题:请问下面程序打印出的结果是什么?【中国某著名杀毒软件企业J公司2008年4月面试题】// P107_example3.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include #include class base{private: int m_i; i原创 2013-07-09 11:24:50 · 1009 阅读 · 0 评论 -
面向对象之成员变量之二
题:指出下面程序的错误。如果把静态成员数据设为私有,该如何访问?【中国台湾某著名计算机硬件公司2005年11月面试题】// P106_example2.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include class Cat{private: int i原创 2013-07-09 11:08:53 · 833 阅读 · 0 评论 -
面向对象的基本概念
题:C++中的空类默认产生哪些类成员函数?【中国某著名综合软件公司2005年面试题】class Empty{ public:};解析:类的概念问题。答案:对于一个空类,编译器默认产生4个成员函数:默认构造函数、析构函数、拷贝构造函数和赋值函数。原创 2013-07-08 09:26:58 · 990 阅读 · 0 评论 -
循环与数组问题2
题2:输入n,求一个n*n矩阵,规定矩阵沿45度线递增,形成一个zigzag数组(JPEG编码里取像素数据的排列形式),请问如何用C++实现?【中国台湾著名硬件公司2007年11月面试题】注:zigzag数组见我的博客http://blog.csdn.net/jimoshuicao/article/details/9053639解析:在JPEG图形算法中首先对图像进行分块处理,一般原创 2013-06-08 09:41:54 · 756 阅读 · 0 评论 -
高效合并两个有序数组
问题:两个有序数组,合并成一个有序数组,假设第一个数组空间足够容纳两个数组。分析:考虑到a数组很大,可以直接在a数组上进行合并,但是要讲究效率。如果单纯从前往后合并,那么效率会非常低,因为a数组后面的数字需要不停的移动。换一种思路,我们采用从后往前合并,首先计算出总长度,设置一个指针从a数组最后往前移动。算法代码:#include #include #include转载 2013-10-18 00:03:52 · 1470 阅读 · 0 评论