
剑指offer
PGEva
芝兰生于深林,不以无人而不芳;君子修道立德,不谓困厄而改节.
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出原来的二叉树并输出它的头结点。二叉树结点的定义如下: struct BinaryTreeNode { int m_n原创 2017-05-23 23:01:21 · 292 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
1 /* 2 调整数组顺序使奇数位于偶数前面 3 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分 4 如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,没碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有 数字往前挪动一位。挪完之后再数组的末尾有一个空位,这时把该偶原创 2017-06-28 09:56:38 · 360 阅读 · 0 评论 -
链表中倒数第K个结点
1 /* 2 链表中的倒数第k个结点 3 题目:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结> 点。例如一个立案表皮有6个结点,从头结点开始它们的值以此是1,2,3,4,5,6.这个链表的倒数第三个结点是指为4的结点。 4 struct ListNode 5 { 6原创 2017-06-28 09:58:14 · 401 阅读 · 0 评论 -
二叉树的镜像
1 /* 2 请完成一个函数,输入一个二叉树,该函数输出它的镜像。 3 二叉树的定义如下: 4 struct BinaryTreeNode 5 { 6 int m_nValue; 7 BinaryTreeNode* m_pLeft; 8 BinaryTr原创 2017-07-16 19:42:18 · 236 阅读 · 0 评论 -
顺时针打印矩阵
1 /* 2 顺时针打印矩阵 3 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:输入如下矩阵: 4 1 2 3 4 5 5 6 7 8 6 9 10 11 12 7 13 14 15 16 8 则依次打印出数字1、2、3、4、8、12、16、原创 2017-07-16 19:44:11 · 342 阅读 · 0 评论 -
包含min函数的栈
1 /* 2 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push及pop的时间复杂度都是O(1)。 3 分析发现,可以把每次的最小元素(之前的最小元素和新压入栈的元素两者的较低值)都保存起来到另外一个辅助栈里面。举例论证。 4 首先往空的数据栈亚茹数字3,显然现在3是最小值,我们也把这个最小值压入辅助栈,原创 2017-07-16 19:45:31 · 310 阅读 · 0 评论 -
从上往下打印二叉树
1 /* 2 从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印例如输出图4.5中的二叉树,则依次打印出8、6、10、5、7、9、11。 3 struct BinaryTreeNode 4 { 5 int m_nValue; 6 BinaryTreeNode* m_pLeft; 7原创 2017-07-16 19:49:00 · 416 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
1 /* 2 二叉搜索树的后序遍历序列 3 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数组的任意两个数字都互不相同。 4 例如输入数组{5,7,6,9,11,10,8},则返回true,因为这个整数序列是下图的二叉搜索树的后序遍历结果。 5原创 2017-07-17 10:26:57 · 461 阅读 · 0 评论 -
从1到n整数中1出现的次数:O(logn)算法
问题: 给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。 例如: N= 2,写下1,2。这样只出现了1个“1”。 N= 12,我们会写下1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12。这样,1的个数是5。 一、暴力求解,不被推荐class Solution{public: int NumberOf1Betw原创 2017-08-14 12:07:28 · 590 阅读 · 2 评论 -
字符串的全排列和组合算法
全排列在笔试面试中很热门,因为它难度适中,既可以考察递归实现,又能进一步考察非递归的实现,便于区分出考生的水平。所以在百度和迅雷的校园招聘以及程序员和软件设计师的考试中都考到了,因此本文对全排列作下总结帮助大家更好的学习和理解。对本文有任何补充之处,欢迎大家指出。 首先来看看题目是如何要求的(百度迅雷校招笔试题)。 一、字符串的排列 用C++写一个函数, 如 Foo(const char *s转载 2017-08-07 15:11:55 · 655 阅读 · 0 评论 -
把数组排成最小的数
输入一个正整数数组,把数组中所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排出的最小数字321323对vector容器内的数据进行排序,按照 将a和b转为string后 若 a+bclass Solution {public: string PrintMinNumber(vector<int> numbers) {原创 2017-09-08 14:31:26 · 388 阅读 · 0 评论 -
丑数
我们把只包含因子2、3、5的数称为丑数。求按从大到小的顺序的第1500个丑数。例如6、8是丑数,但14不是,因为他包含因子7.习惯上我们把1当做第一个丑数。根据丑数的定义,丑数应该是另一个丑数乘以2、3、或者5的结果。因此我们可以创建一个数组, 里面的数乘以2、3、5的结果(1除外)。因此我们可以创建一个数组,里面的数字是 排好序的丑数,每一个丑数都是前面的丑数乘以2、3、5得到的。#inclu原创 2017-09-08 15:31:43 · 438 阅读 · 0 评论 -
在O(1)的时间删除链表结点
1 /* 2 在O(1)的时间删除链表结点 3 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下 4 struct ListNode 5 { 6 int m_nValue; 7 ListNode* m_pNext; 8原创 2017-06-28 09:52:45 · 364 阅读 · 0 评论 -
打印1到n最大的n位数
1 /* 2 输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1,2,3一直到最大的3位数即999 3 */ 4 5 //如果初看的话很容易认为题目非常简单,用一个循环喀什逐个打印就可以。但是仔细分析这个问题,我们就可以知道并么有规定n的范> 围。当输入 n很大的时候,我们求最大的n位数用long long都会溢出,也就是考虑大数问题原创 2017-06-28 09:49:15 · 373 阅读 · 0 评论 -
用两个栈实现一个队列 用两个栈实现一个队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成再队列尾部插入结点和在队列头部删除结点 的功能 删除一个元素的步骤是:当stack2中不存在元素的时候,在stack2中的栈顶元素是最先进入队列的元素,可以弹出来,当stack2中为空的时候,> 我们把stack1中的元素逐个弹出并压入stack2.由于先进入队列的元素被压到s原创 2017-05-26 21:45:09 · 434 阅读 · 0 评论 -
二维数组的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否有该整数。 在查找一个数字的时候,可以先从数组的右上角选取数字来和查找的数字进行比较,如果该数字等于要查找的数字,查找过程结束,如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说原创 2017-05-22 21:40:23 · 390 阅读 · 0 评论 -
字符串替换
请实现一个函数,把字符串中的每个空格替换成"%20".例如输入"We are happy". 则输出"We%20are%20happy." 我们可以先遍历一次字符串,这样就可以统计出字符串中空格的个数,并可以由此计算出替换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换后字符串的长度等于原来的长度加上2乘以空格数目。我们还是以前面的字符串"We are happy.原创 2017-05-22 21:42:13 · 390 阅读 · 0 评论 -
输入一个链表的头结点,从尾到头反过来打印每个结点的值
可以利用栈的结构来存储,每经过一个结点的时候,把该结点放到一个栈当中去,当遍历完整个链表后,再从栈顶开始主格输出结点的值struct ListNode{ int m_nKey; ListNode* m_pNext;};void PrintListReversingly_Iteratively(ListNode* pHead){ std::stack = pHead; Lis原创 2017-05-22 21:45:37 · 1216 阅读 · 0 评论 -
反转链表
1 /* 2 定义一个函数 输入一个链表的头结点 反转该链表并输出反转后链表的头结点 3 struct ListNode 4 { 5 int m_nKey; 6 ListNode* m_pNext; 7 }; 8 解决链表相关的问题总是有大量的指针操作 而指针的操作原创 2017-06-28 19:13:17 · 303 阅读 · 0 评论 -
合并两个排序的链表
1 /* 2 合并两个排序的链表 3 输入两个递增排序的链表,合并这两个链表并使新链表中的点仍然是按照递增排序的。链表结点定义为: 4 struct LsitNode 5 { 6 int m_nValue; 7 ListNode* m_pNext; 8 };原创 2017-06-28 19:15:48 · 525 阅读 · 0 评论 -
树的子结构
1 /* 2 输入两课二叉树A和B,判断B是不是A的子结构。二叉树的定义如下: 3 struct BinaryTreeNode 4 { 5 int m_nValue; 6 BinaryTreeNode* m_pLeft; 7 BinaryTreeNode* m_原创 2017-06-28 19:16:55 · 455 阅读 · 0 评论 -
旋转数字的最小数字
旋转数字的最小数字题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2},为{1,2,3,4,5}的一个旋转,该数组的最小值为1这道题目最直观的解法并不难,从头到尾遍历数组一次,我们就能找出最小的元素。这种思路的时间复杂度显然是O(n)。但是这个思路没有利用输入的旋转数组的特性,肯定达原创 2017-06-14 16:22:34 · 540 阅读 · 0 评论 -
斐波那契数列
面试题9:斐波那切数列533 写一个函数,输入n,求斐波那切数列的第n项。斐波那切数列的定义如下:f(n) = (0 n = 0; 1 n = 1; f(n-1) + f(n-2))534 效率太低的解法,挑剔的面试官可能不会喜欢535 long long Fibonacci(unsigned int n)536 {537 if(原创 2017-06-14 16:25:25 · 507 阅读 · 0 评论 -
二进制1的个数
585 * 二进制的位运算并不是很难掌握,因为位运算总共只有5种运算:与,或,异或,左移,和右移。与,或,和异或运算的规律我们可以用下表总 结586 * 与(&) 0 & 0 = 0 1 & 0 = 0 0 & 1 = 0 1 & 1 = 1587 * 或(|) 0 | 0 = 0 1 | 0 = 1 0 | 1 = 1 1 | 1 =原创 2017-06-14 16:50:15 · 351 阅读 · 0 评论 -
数值的整次方
2 实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题 代码如下: 5 #include 6 using namespace std; 7 8 bool g_InvaildInput = false; 9 10 double PowerWithUnsigne原创 2017-06-28 09:45:16 · 321 阅读 · 0 评论 -
第一个只出现一次的字符
在字符串中找出第一个只出现一次的字符。如输入”abaccdeff”,则输出’b’。我们可以定义一个哈希表,键值是字符,而值是该字符出现的次数。同时我们还需要从头开始扫描字符串两次。第一次扫描字符串时,每扫描到一个字符就在哈希表的对应项中把次数加1.接下来第二次扫描时,每扫描到一个字符就能从哈希表中得到该字符出现的次数。这样第一个值出现一次的字符就是符合该要求的输出。#include <iostrea原创 2017-09-08 15:43:35 · 447 阅读 · 0 评论