
数据结构与算法
文章平均质量分 51
金融行业的一个码农
潜心修炼编码之道
展开
-
求链表的倒数第k个数值(亲测有效,环境VS2010)
题目:输入一个链表,输出该链表中倒数第k个结点的值。为符合大家的习惯的,本题目从1开始计数,级链表的尾结点是倒数第一个结点。代码如下:#include #include struct ListNode{ int m_pValue; ListNode* m_pNext;};/*输入链表为NULL或k为0时都安全返回,鲁棒性良好*/ListNode* FindkthTo原创 2015-04-10 17:41:35 · 472 阅读 · 0 评论 -
数制转换:如何将十进制数N转换为x进制数?(用栈实现)
如果如果将十进制N转换为x进制数,需要用辗转原创 2014-05-22 15:44:09 · 4964 阅读 · 0 评论 -
微软面试100题之第五题
题目:输入n 个整数,输出其中最小的 k 个。例如输入 1 , 2 , 3 , 4 , 5 , 6 , 7 ,8 这 8 个数字,则最小的 4 个数字为 1 , 2 , 3 和 4 。分析: 本题最简单也最容易想到的解决方法就是把输入的n个整数排序了。当然,排序也有好多种方法,是选择排序、插入排序、快速排序还是堆排序?如果是堆排序还要分为是用大根堆还是小根转载 2014-04-14 13:03:13 · 637 阅读 · 0 评论 -
求矩阵中元素和最大的二维子矩阵
求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 0 3 4 2 3 4 5 1 1 1 5 3 0 中最大的二维矩阵是: 4 5 5 3转载 2014-05-13 17:55:54 · 605 阅读 · 0 评论 -
实现一个挺高级的字符匹配算法: 给一串很长字符串,要求找到符合要求的字符串,例如目的串:123 1******3***2 ,12*****3 这些都要找出来
实现一个挺高级的字符匹配算法: 给一串很长字符串,要求找到符合要求的字符串,例如目的串:123 1******3***2 ,12*****3 这些都要找出来转载 2014-05-13 17:47:15 · 1166 阅读 · 0 评论 -
链表的反转
题目:输入一个链表的头结点,反转该链表,并返回反转后链表的头结点。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:这是一道广为流传的微软面试题。由于这道题能够很好的反应出程序员思维是否严密,在微软之后已经有很多公司在面试时采用了这道题。为了正确地反转一个链表,需转载 2014-04-13 12:54:03 · 447 阅读 · 0 评论 -
线性表的顺序表示与实现(C++版)
#define ListSize 100typedef struct{ DataType list[ListSize]; int length;}SeqList;原创 2014-05-18 18:30:56 · 3204 阅读 · 0 评论 -
双向链表的表示与实现(C++版)
双向链表的结点存储结构描述如下:原创 2014-05-19 10:13:19 · 754 阅读 · 0 评论 -
线性表的链式表示和实现(C++版)
单链表的存储结构描述如下:原创 2014-05-18 20:54:36 · 980 阅读 · 0 评论 -
栈的顺序表示与实现(C++版)
栈的定义:栈,也称为堆栈,他是原创 2014-05-22 10:15:06 · 1238 阅读 · 0 评论 -
共享栈的实现(C++版)
前言栈的应用原创 2014-05-22 10:45:23 · 2477 阅读 · 0 评论 -
括号配对:假设一个数学算式中包括圆括号"()",方括号”[]"和花括号“{}”三种类型,编写一算法判断表达式的括号是否配对。
题目:假设一个数学算式中包括圆括号"()",方括号”[]"和花括号“{}”三种类型,编写一算法判断表达式的括号是否配对。分析:原创 2014-05-22 19:24:32 · 23581 阅读 · 2 评论 -
二叉树的计数(C++版)
1.统计二叉树的叶子结点个数原创 2014-05-24 19:31:10 · 938 阅读 · 0 评论 -
二叉树的遍历(C++版)
二叉树的先序遍历:(1)访问原创 2014-05-24 17:10:30 · 581 阅读 · 0 评论 -
二叉树的链式存储与实现(C++)
二叉链表存储结构的类型定义如下:原创 2014-05-24 15:13:10 · 2957 阅读 · 0 评论 -
顺序队列的假溢出及顺序循环队列的表示(C++版)
顺序队列的假溢出:按照原创 2014-05-23 15:57:52 · 3120 阅读 · 0 评论 -
数据结构中树的一些基本概念
树是一种非线性的数据结构,树中的元素之间是一对多的原创 2014-05-24 14:06:46 · 1014 阅读 · 0 评论 -
二叉树的输出(C++版)
二叉树的打印输出方式,除了按照先序原创 2014-05-24 20:22:23 · 10088 阅读 · 0 评论 -
队列的顺序存储及实现(C++版)
队列是一种特殊的线性表,它包含一个队头和一个原创 2014-05-23 15:39:45 · 807 阅读 · 0 评论 -
栈的链式表示与实现(C++版)
链栈结点的类型定义如下:原创 2014-05-22 18:49:46 · 1253 阅读 · 0 评论 -
链栈的表示与实现
链栈结点的类型定义如下:typedef struct node{ DataType data; struct node *next;}LStackNode,*LinkStack;链栈的说明如下:(1)链栈通过链表实现,链表的第一个结点为栈顶,最后一个为栈底。(2)设栈顶指针为top,初始化时,不带头结点top=NULL,带头结点top->next=NULL。原创 2014-05-22 18:53:02 · 2696 阅读 · 0 评论 -
循环单链表的实现方式(C++版)
循环单链表是一种首尾相连的单链表。(原创 2014-05-19 10:30:24 · 904 阅读 · 0 评论 -
通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小
一,题目:有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。 例如: var a=[100 ,99 ,98 ,1 ,2 ,3]; var b=[1, 2, 3, 4, 5, 40]; 有两个序列a,b,大小都为n,序列元素的值转载 2014-04-19 14:23:10 · 848 阅读 · 0 评论 -
在从1 到n 的正数中1 出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。分析:这是一道广为流传的google面试题。简单的方法就是按照给位进行分析在个位出现1的个数=n/10+(个位=0,0;个位>1,1;个位=1,低0位+1);十位位出现1的个数=n/100*10+(十位=0,0;十位转载 2014-04-19 13:57:54 · 506 阅读 · 0 评论 -
微软面试100题之13题:输入一个单向链表,输出该链表中倒数第k 个结点
题目:输入一个单向链表,输出该链表中倒数第k 个结点。链表的倒数第0 个结点为链表的尾指针。链表结点定义如下:struct ListNode{int m_nKey;ListNode* m_pNext;};分析:为了得到倒数第k个结点,很自然的想法是先走到链表的尾端,再从尾端回溯k步。可是输入的是单向链表,只有从前往后的指针而没有从后往前的指针。因此我们需要打开我转载 2014-04-15 15:13:59 · 964 阅读 · 0 评论 -
微软面试100题之11题:求二叉树中节点的最大距离
如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。转载 2014-04-15 14:38:56 · 1236 阅读 · 0 评论 -
微软的一个面试题
★假设你有一个用1001 个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1 到1000(包括1000)之间。此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?原创 2014-04-14 20:32:45 · 609 阅读 · 0 评论 -
题目:求1+2+…+n, 要求不能使用乘除法、for、while、if、else、switch、case 等关键字以及条件判断语句
代码如下1int nFactorial(int n)2{3 int num = 0;4 (n > 0) && (num = n + nFactorial(n - 1));56 return num;7}在第四句,如果n转载 2014-04-14 20:56:31 · 1131 阅读 · 0 评论 -
不用乘法或加法增加8 倍。现在用同样的方法增加7 倍。
n(n转载 2014-04-14 20:34:37 · 1086 阅读 · 0 评论 -
比较两个字符串,用O(n)时间和恒量空间
int strcmp(char * p1, char * p2) { while (*p1 != ‘\0’ && *p2 != ‘\0’ && *p1 == *p2) { p1++, p2++; } if (*p1 == ‘\0’ && *p2 == ‘\0’) return 0; if (*p1 == ‘\0’) return -1; if (*p2 ==转载 2014-04-14 20:02:46 · 583 阅读 · 0 评论 -
在一个字符串中找到一个子字符串
char* FindSubString(char* pStr, char* pSubStr){ unsigned int iMainStrLen = 0; unsigned int iSubStrLen = 0; unsigned int i,j; unsigned int ii,jj; if(pStr==NULL || pSubStr==NULL)转载 2014-04-14 19:59:28 · 718 阅读 · 0 评论 -
颠倒一个字符串。优化速度。优化空间。
void reverse(char *str) { reverseFixlen(str, strlen(str));}void reverseFixlen(char *str, int n) { char* p = str+n-1; while (str char c = *str; *str++ = *p; *p--=c; } }原创 2014-04-14 13:38:17 · 1277 阅读 · 0 评论 -
微软面试100题之第三题:求子数组的最大和
3.求子数组的最大和题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。ANSWER: A traditiona转载 2014-04-13 19:32:33 · 688 阅读 · 0 评论 -
输出一个单向链表的中间节点
接着上一篇:微软面试100题之13题:输入一个单向链表,输出该链表中倒数第k 个结点原创 2014-04-15 15:31:53 · 868 阅读 · 0 评论 -
微软面试100题之17题:在一个字符串中找到第一个只出现一次的字符
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。分析:这道题是2006 年google 的一道笔试题。看到这道题时,最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路时间转载 2014-04-15 20:07:43 · 697 阅读 · 0 评论 -
微软面试100题之20题:输入一个表示整数的字符串,把该字符串转换成整数并输出
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。转载 2014-04-15 21:00:01 · 1139 阅读 · 0 评论 -
微软面试100题之29题:栈的push、pop 序列
int isPopSeries(int push[], int pop[], int n) {stack helper;int i1=0, i2=0;while (i2 while (stack.empty() || stack.peek() != pop[i2]) {if (i1stack.push(push[i1++]);else return 0;whil转载 2014-04-19 13:46:27 · 1155 阅读 · 0 评论 -
微软面试100题之27题:跳台阶问题
题目1:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法。 分析: 这道题最近经常出现,包括MicroStrategy等比较重视算法的公司都曾先后选用过个这道题作为面试题或者笔试题。 首先我们考虑最简单的情况。如果只有1级台阶,那显然只有一种跳法。如果有2级台阶,那就有两种跳的方法了:一种是分两次跳,每次跳1级;另外转载 2014-04-18 10:49:42 · 739 阅读 · 0 评论 -
微软面试100题之26题:左旋转字符串
题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef 左旋转2 位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n 的字符串操作的复杂度为O(n),辅助内存为O(1)。转载 2014-04-18 10:42:33 · 711 阅读 · 0 评论 -
链表操作:按值的顺序从小到大, 合并两个链表
Node * merge(Node * h1, Node * h2) { if (h1 == NULL) return h2; if (h2 == NULL) return h1; Node * head; if (h1->data>h2->data) { head = h2; h2=h2->next; } else { head = h1; h1=h1->ne转载 2014-04-18 10:20:13 · 2650 阅读 · 1 评论