数据结构 刀疤鸭 先疯盗骨
文章平均质量分 76
会飞牛牛
这个作者很懒,什么都没留下…
展开
-
调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。分析:如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有数字往前挪动一位。挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位。由于碰到一个偶数,需要移动O(n)个数字,因此总的时间复杂度是O(转载 2012-05-27 23:27:32 · 345 阅读 · 0 评论 -
从尾到头输出链表--归纳
题目:输入一个链表的头结点,从尾到头反到来输出每个结点的值。链表结点定义如下:struct ListNode{int m_nKey;ListNode* m_pNext;};这道题难度该当不大,看能想出几种做法,另外即便要当心这个题目的变体,原文中有讲到。我能想到的思路有三种,和原文差不多。措施一、先把链表反向,然后再过去到后遍历一遍。措施二、设一个栈,过去到后遍转载 2012-05-27 23:34:14 · 379 阅读 · 0 评论 -
二元树的深度
题目:输入一棵二元树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 例如:输入二元树: 10 / /转载 2012-05-27 23:15:27 · 373 阅读 · 0 评论 -
在O(1)时间内删除链表结点
题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};函数的声明如下:void DeleteNode(ListNode* pListHead, ListNode* pToBeDel转载 2012-05-27 23:33:13 · 349 阅读 · 0 评论 -
字符串的排列
题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符 a、b、c所能排列出来的所有字符串 abc、acb、bac、bca、cab和cba。 分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出现在各大公司的面试、笔试题中。 我们以三个字符 abc为例来分析一下求字符串排列的过程。首先我们固定第一个字转载 2012-05-27 23:16:21 · 318 阅读 · 0 评论 -
在二元树中找出和为某一值的所有路径
在二元树中找出和为某一值的所有路径 题目:输入一个整数和一棵二元树。 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。 打印出和与输入整数相等的所有路径。 例如输入整数22 和如下二元树 10 / \ 5 12 /\ 4 7 则打印出两条路径:10, 12 和10, 5, 7。 二元树节点的数据结构定义为: struct Binar转载 2012-05-13 12:16:45 · 468 阅读 · 0 评论 -
翻转句子中单词的顺序
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。分析:由于编写字符串相关代码能够反映程序员的编程能力和编程习惯,与字符串相关的问题一直是程序员笔试、面试题的热门题目。本题也曾多次受到包括微软在内的大量公司的青睐。由于本转载 2012-05-13 17:30:22 · 348 阅读 · 0 评论 -
判断两个链表是否相交并找出交点
问题描述:一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点。思路:1、碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想法当然是可以的。2、当然采用暴力的方法也是可以的,遍历两个链表,在遍历的过程中进行比较,看节点是否相同。3、第三种思路是比较奇特的,在编程之美上看到的。先遍历第一个链表到他的尾部,然后将尾部的n转载 2012-05-13 17:45:50 · 557 阅读 · 0 评论 -
Top K算法详细解析---百度面试
问题描述:这是在网上找到的一道百度的面试题:搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。假设目前有一千万个记录,这些查询串的重复度比较 高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。请你统计最热门的10个查询 串,要求使用的内存不能超过1G。转载 2012-05-13 13:11:15 · 573 阅读 · 0 评论 -
输入一个单向链表,输出该链表中倒数第k个结点
题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下:struct ListNode{intm_nKey;ListNode* m_pNext;};分析:为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。可是输入的是单向链表,只有从前往后的指针而没有从后往前的指针。因此我们需要打开我们的思路。转载 2012-05-14 00:15:15 · 732 阅读 · 0 评论 -
求子数组的最大和
题目: 输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18。 Java代码 /****/pack转载 2012-05-13 12:11:50 · 412 阅读 · 0 评论 -
求二叉树中节点的最大距离
求二叉树中节点的最大距离 2010-10-26 16:03:37| 分类:数据结构与算法 | 标签:proot节点pleftprightnmaxleft |字号大中小订阅 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义“距离”为两个节点之间边的个数。写一个程序求一颗二叉树中相距最远的两个节点之间的转载 2012-05-13 23:59:32 · 590 阅读 · 0 评论 -
题目:求1+2+…+n
题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。思路一(转)-----------------循环只是让相同的代码执行n 遍而已,我们完全可以不用for 和while 达到这个效果。比如定义一个类,我们new 一含有n 个这种类型元素的数组,那么该类的构造函数将确定会被调用n转载 2012-05-14 00:06:26 · 725 阅读 · 0 评论 -
输入一个已经按升序排序过的数组和一个数字
题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。public class TwoElementEqualSum { /**转载 2012-05-14 22:36:31 · 746 阅读 · 0 评论 -
输入一个表示整数的字符串,把该字符串转换成整数并输出
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。分析:这道题尽管不是很难,学过C/C++语言一般都能实现基本功能,但不同程序员就这道题写出的代码有很大区别,可以说这道题能够很好地反应出程序员的思维和编程习惯,因此已经被包括微软在内的多家公司用作面试题。建议读者在往下看之前自己先编写代码,再比较自己写的代码和下面的参考代码有哪些不同。首先我转载 2012-05-15 00:15:54 · 1410 阅读 · 0 评论 -
【练习】输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印
/************************************************************************//* 题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。例如输入 8 / \ 6 10 /\ /\ 5 7 9 11 输出8 6 10 5 7 9 11。思路转载 2012-05-14 23:31:10 · 434 阅读 · 0 评论 -
在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b
/************************************************************************//* 在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b如果从头遍历,与后面字符进行比较出现次数是否为1,算法复杂度为O(n^2),考虑以空间换时间,因为一个字符最多两个字节,占8位。因此可用一个256位数转载 2012-05-14 23:58:58 · 415 阅读 · 0 评论 -
n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。分析:既然题目有一个数字圆圈,很自然的想法是我们用一个数据结构来模拟这个圆圈。在常用的数据结构中,我们很容易想到用环形列表。我们可以创建一个总共有m个数转载 2012-05-15 00:10:44 · 818 阅读 · 0 评论 -
输入一颗二元查找树,将该树转换为它的镜像
题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。 例如输入: 8 / / 6 10 // //5 7 9 11输出: 8 / / 10 6 // //11 9 7 5定义二元查找树的结点为:struct BSTreeN转载 2012-05-14 23:10:08 · 481 阅读 · 0 评论 -
Fibonacci数列
题目:定义Fibonacci数列如下: / 0 n=0f(n)= 1 n=1 / f(n-1)+f(n-2) n=2输入n,用最快的方法求该数列的第n项。分析:在很多C语言教科书中讲到递归函数的时候,都会用Fibonacci作为例子。/*********************************************************转载 2012-05-15 00:13:47 · 536 阅读 · 0 评论 -
输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数
输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来./** * 输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数, 使其和等于 m ,要求将其中所有的可能组合列出来. e.g n=6,m=6 1,2,3 2,4转载 2012-05-15 22:56:07 · 1463 阅读 · 0 评论 -
有4张红色的牌和4张蓝色的牌
有4张红色的牌和4张蓝色的牌,主持人先拿任意两张,再分别在A、B、C三人额头上贴任意两张牌,A、B、C三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上是什么颜色的牌,A说不知道,B说不知道,C说不知道,然后A说知道了。请教如何推理,A是怎么知道的。如果用程序,又怎么实现呢?思路:目的是推导出A的颜色,由于A先看B、C,则应先假定B、C的颜色然后推导转载 2012-05-15 23:45:06 · 7747 阅读 · 0 评论 -
链表操作
24、链表操作题目:链表操作,(1)单链表就地逆置,(2)合并链表#include #include typedef struct node { struct node *next; int value; }LinkList;转载 2012-05-18 22:25:51 · 791 阅读 · 0 评论 -
左旋转字符串
题目描述:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。 编程之美上有这样一个类似的问题,咱们先来看一下:设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用转载 2012-05-18 22:34:18 · 630 阅读 · 0 评论 -
统计整数二进制表示中1的个数
这是一个很有意思的问题,也是在面试中最容易被问到的问题之一。这个问题有个正式的名字叫Hamming_weight,而且wikipedia上也提供了很好的位运算解决的方法,这个下面也会提到。解决这个问题的第一想法是一位一位的观察,判断是否为1,是则计数器加一,否则跳到下一位,于是很容易有这样的程序。?12345678910转载 2012-05-18 22:43:27 · 1125 阅读 · 0 评论 -
程序员面试题精选100题(24)-栈的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-05-18 23:01:39 · 543 阅读 · 0 评论 -
计算1到N的十进制数中1的出现次数
问题描述:给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有"1"的个数。例如:N = 2,写下1,2。这样只出现了1个"1"。N = 12,写下1,2,……,12,这样有5个"1"。写一个函数f(N),返回1到N之间出现的"1"的个数,比如f(12) = 5。假设N = abcde,这里a,b,c,d,e分别是十进制数N的各个数位上的数字。如果要计算百转载 2012-05-18 23:18:52 · 597 阅读 · 0 评论 -
有两个序列a,b,大小都为n,序列元素的值任意整数,无序
java-32.通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。Java代码 import java.util.Arrays;public class MinSumASumB {/*** Q32.有两个序列a,b,大小都为n,序列元素的值任意整数,无序.** 要求:通过交换a,b中的元素,使[序列a元素的和]与[序转载 2012-05-18 23:54:26 · 1345 阅读 · 0 评论 -
程序员面试100题之十四:强大的和谐
实现一个挺高级的字符匹配算法:给一串很长字符串,要求找到符合要求的字符串,例如目的串:1231******3***2 ,12*****3 这些都要找出来,其实就是类似一些和谐系统。。。。。 这题的真正意思就是,给你一个目标串,如“123”,只要一个字符串里面同时包含1、2和3,那么这个字符串就匹配了。系统越和谐,说明错杀的可能行也就越大。加入目标串的长度为m,模式串的长转载 2012-05-19 00:02:20 · 345 阅读 · 0 评论 -
求一个矩阵中最大的二维矩阵(元素和最大)
求一个矩阵中最大的二维矩阵(元素和最大).如:1 2 0 3 42 3 4 5 11 1 5 3 0中最大的是:4 55 3要求:(1)写出算法;(2)分析时间复杂度;(3)用C写出关键代码public class MaxSubMatrix { /**see http://blog.csdn.net/zhanxinhang/artic转载 2012-05-19 10:16:16 · 573 阅读 · 0 评论 -
在字符串中找出连续最长的数字串
功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值为123456789#include #include int Findmaxlen(char *input,char *out转载 2012-05-18 22:28:40 · 470 阅读 · 0 评论 -
跳台阶问题
题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法。分析:这道题最近经常出现,包括MicroStrategy等比较重视算法的公司都曾先后选用过个这道题作为面试题或者笔试题。首先我们考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级;另外一种就是一次跳2级。现在我们再来讨论一般情况。我们转载 2012-05-18 22:39:53 · 714 阅读 · 0 评论 -
有n 个长为m+1 的字符串
有n 个长为m+1 的字符串,如果某个字符串的最后m 个字符与某个字符串的前m 个字符匹配,则两个字符串可以联接,问这n 个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。 分析一下,将各个字符串作为一个节点,首尾链接就好比是一条边,将两个节点连接起来,于是问题就变成一个有关图的路径长度的问题。链接所得的字符串最长长度即为从图的某个节点出发所能得到的最长路径问题,与最短路径类转载 2012-05-19 22:33:08 · 641 阅读 · 0 评论 -
递归和非递归俩种方法实现二叉树的前序遍历
咱们先来复习下,基础知识。二叉树结点存储的数据结构:typedef char datatype;typedef struct node{datatype data;struct node* lchild,*rchild;} bintnode;typedef bintnode* bintree;bintree root;1.树的前序遍历即:按根 左 右转载 2012-05-22 00:00:21 · 756 阅读 · 0 评论 -
请修改append函数,利用这个函数实现
两个非降序链表的并集,1->2->3 和 2->3->5 并为 1->2->3->5另外只能输出结果,不能修改两个链表的数据。#include #include #include struct Node{ int num; Node * next;};Node * createTail(){ int x; Node *head转载 2012-05-21 23:44:34 · 1390 阅读 · 1 评论 -
求最长单调递减子序列
问题描述:给出一个数列,找出其中最长的单调递减(或递增)子序列。解题思路:动态规划。假设0到i-1这段数列的最长递减序列的长度为s,且这些序列们的末尾值中的最大值是t。对于a[i]有一下情况:(1) 如果a[i]比t小,那么将a[i]加入任何一个子序列都会使0到i的最长单调序列长度变成s+1,这样的话,在0到i的数列中,长度为s+1的递减子序列的末尾值最大值就是a[i];(2) 如转载 2012-05-24 23:29:06 · 788 阅读 · 0 评论 -
四对括号可以有多少种匹配排列方式?
四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和(())#include #include #include using namespace std ; void Print(vector v) { for (vector::iterator beg=v.begin();beg!=v.end();++beg) cout<转载 2012-05-25 23:59:13 · 749 阅读 · 0 评论 -
在O(1)时间删除链表结点--总结
题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};函数的声明如下:void DeleteNode(ListNode*pListHead, ListNode*pToBeDeleted); 这转载 2012-08-06 11:05:11 · 1052 阅读 · 0 评论 -
用C++设计一个不能被继承的类
分析:这是Adobe 公司2007 年校园招聘的最新笔试题。这道题除了考察应聘者的C++ 基本功底外,还能考察反应能力,是一道很好的题目。在Java 中定义了关键字final ,被final 修饰的类不能被继承。但在C++ 中没有final 这个关键字,要实现这个要求还是需要花费一些精力。首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类转载 2012-08-06 10:40:16 · 341 阅读 · 0 评论 -
找出链表的第一个公共结点(链表)。
题目:两个单向链表,找出它们的第一个公共结点。链表的结点定义为:structListNode { int m_nKey ; ListNode * m_pNext ; };分析:这是一道微软的面试题。微软非常喜欢与链表相关的题目,因此在微软的面试题中,链表出现的概率相当高。如果两个单向链表转载 2012-08-06 13:43:07 · 407 阅读 · 0 评论