![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
文章平均质量分 89
报恩的猫
码农
展开
-
面试题31 连续子数组的最大和
题目:输入一个整型数组,数据元素有正数也有负数,求元素组合成连续子数组之和最大的子数组,要求时间复杂度为O(n)。例如:输入的数组为1, -2, 3, 10, -4, 7, 2, -5,最大和的连续子数组为3, 10, -4, 7, 2,其最大和为18。背景:本题最初为2005年浙江大学计算机系考研题的最后一道程序设计题,在2006年里包括google在内的转载 2014-10-08 18:43:57 · 381 阅读 · 0 评论 -
面试题20 顺时针打印矩阵
分析:把矩阵想象成若干个圈,用一个循环打印矩阵,每次打印矩阵的一个圈[cpp] view plaincopy#include "stdafx.h" #include using namespace std; void PrintMatrixIncircle(int **nArr, int r转载 2014-09-12 15:50:13 · 438 阅读 · 0 评论 -
面试题29 数组中出现次数超过一半的数字
方法一:先对数组进行排序,再遍历排序后的数组,统计每个数的次数,出现次数最大的数即为要找的数。时间复杂度 O(nlogn) + O(n) = O(nlogn)不需要额外存储空间方法二:先对数组进行排序,出现次数超过数组长度的一半的数必然是数组中间的那个数时间复杂度O(nlgn)+ O(1)= O(nlgn)不需要额外存储空间方法三:不排序,扫描转载 2014-09-14 15:32:39 · 516 阅读 · 0 评论 -
面试题11 数值的整数次方
题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。题目链接:http://ac.jobdu.com/problem.php?pid=1514这道题目有以下几点需要注意:0的0次方是无意义的,非法输入0的负数次方相当于0作为除数,也是无意义的,非法输入b转载 2014-09-11 15:19:47 · 400 阅读 · 0 评论 -
面试题12 打印1到最大的n位数
题目:输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999。分析:这是一道很有意思的题目。看起来很简单,其实里面却有不少的玄机。算法一:最直观的算法,求出最大的n位数是多少,然后一个循环打印。[cpp] view plaincopyvoid Print1ToMaxOfNDigits1(转载 2014-09-11 17:17:03 · 410 阅读 · 0 评论 -
面试题14 调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。方法:设2个头尾指针begin和end, begin从头往前遍历,遇到奇数的话,说明这个数在在正确的位置,所以继续往前遍历直到遇到第一个偶数。同样end指针从后往前遍历,遇到偶数的话,说明这个数在正确的位置,所以继续往前遍历,直到遇到第转载 2014-09-11 20:38:02 · 401 阅读 · 0 评论 -
面试题26 复杂链表的复制
[cpp] view plaincopyprint?struct ComplexListNode { int m_nValue; ComplexListNode* m_pNext; ComplexListNode* m_pSibling; }; 以下图为5个结点的复杂链表,实线表示m_pNext指针的指转载 2014-09-13 21:59:00 · 426 阅读 · 0 评论 -
面试题6 先序和中序建二叉树
public class BuildTreePreOrderInOrder { /** * Build Binary Tree from PreOrder and InOrder * _______7______ / \ __10__ ___2 / \转载 2014-09-10 13:59:58 · 376 阅读 · 0 评论 -
面试题7 两个栈实现队列
已知下面Stack类及其3个方法Push、Pop和 Count,请用2个Stack实现Queue类的入队(Enqueue)出队(Dequeue)方法。class Stack{…public:void Push(int x); // Push an element in stack;int Pop(); // Pop an element out of stack;i转载 2014-09-10 14:26:15 · 400 阅读 · 0 评论 -
面试题8 求旋转后(3 4 5 1 2)的数组中的最小元素
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.实现数组的旋转见左旋转字符串。和二分查找法一样,用两个指针分别指向数组的第一个元素和最后一个元素。我们注意到旋转之后的数组实际上可以划分为两个排序的子数组,而且转载 2014-09-10 14:40:08 · 538 阅读 · 0 评论 -
剑指Offer:从尾到头打印链表
题目1511:从尾到头打印链表时间限制:1 秒内存限制:128 兆特殊判题:否提交:1082解决:350题目描述:输入一个链表,从尾到头打印链表每个节点的值。输入:每个输入文件仅包含一组测试样例。每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类转载 2014-05-23 21:25:43 · 413 阅读 · 0 评论 -
二叉搜索树转换为有序双向链表
一、问题描述输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现。二、实现思路在二叉搜索树中,每个结点都有两个分别指向其左、右子树的指针,左子树结点的值总是小于父结点的值,右子树结点的值总是大于父结点的值。而在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点。所以这两种转载 2014-09-02 16:54:25 · 559 阅读 · 0 评论 -
面试题30 最小的K个数
何海涛:《剑指Offer:名企面试官精讲典型编程题》:九度OJ题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。输入:每个测试案例包括2行:第一行为2个整数n,k(1第二行包含n个整数,表示这n个数,数组中的数的范围是[0,1000 000 000]。转载 2014-10-08 18:39:34 · 364 阅读 · 0 评论 -
面试题18 二叉树B是不是A的子结构
思路:首先在树A中找到和B的根结点的值一样的结点R,然后再判断树A中以R为根的子树是否包含树B一样的结构。递归代码:[cpp] view plaincopy#include "stdafx.h" #include using namespace std; struct BinaryTreeNode {转载 2014-09-12 10:20:15 · 440 阅读 · 0 评论 -
面试题28 字符串的全排列
1、题目输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab、cba。2、解题分析把复杂的问题分解成小问题。把一个字符串看成由两部分组成:第一部分为它的第一个字符,第二部分是后面的所有字符。如图1所示。在求整个字符串的排列时,看成两步:首先求所有可能出现在第一个位转载 2014-09-13 22:21:42 · 520 阅读 · 0 评论 -
面试题25 二叉树中和为某一值的路径
代码:[cpp] view plaincopy#include "stdafx.h" #include #include using namespace std; struct BinaryTreeNode { int m_nValue; BinaryTreeNode *转载 2014-09-12 22:17:39 · 456 阅读 · 0 评论 -
面试题9 斐波那契数列
题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。斐波那契数列的定义如下: 输入:输入可能包含多个测试样例,对于每个测试案例,输入包括一个整数n(1输出:对应每个测试案例,输出第n项斐波那契数列的值。样例输入:3样例输出:2 ?转载 2014-09-10 15:01:51 · 425 阅读 · 0 评论 -
面试题17 合并两个排序的链表
题目描述:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。(hint: 请务必使用链表。)输入:输入可能包含多个测试样例,输入以EOF结束。对于每个测试案例,输入的第一行为两个整数n和m(0下面一行包括n个数t(1输出:对应每个测试案例,若有结果,输出相应的链表。否则,输出N转载 2014-09-11 22:13:49 · 644 阅读 · 0 评论 -
面试题15 链表中倒数第K个结点
题目描述:输入一个链表,输出该链表中倒数第k个结点。(hint: 请务必使用链表。)输入:输入可能包含多个测试样例,输入以EOF结束。对于每个测试案例,输入的第一行为两个整数n和k(0输入的第二行包括n个数t(1输出:对应每个测试案例,若有结果,输出相应的查找结果。否则,输出NULL。样例输入:转载 2014-09-11 20:43:20 · 375 阅读 · 0 评论 -
面试题13 在o(1)时间删除链表的给定结点
方法一:顺序查找要删除的结点,并在链表中删除。时间复杂度为O(n),不满足题目要求代码:[cpp] view plaincopyvoid DeleteNode(ListNode **pListHead, ListNode *pToBeDeleted) { if (*pListHead != NULL && pToB转载 2014-09-11 19:35:40 · 378 阅读 · 0 评论 -
面试题34 丑数
问题描述: 我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。(昨天突然发现个不错的博客:http://blog.csdn.net/v_JULY_v,突然知道丑数这个题,于是搜之) 当然,最简单的肯定是遍历啊,想当年初学的时转载 2014-10-08 21:09:58 · 1534 阅读 · 0 评论 -
面试题23 从上往下打印二叉树
代码:[cpp] view plaincopy#include "stdafx.h" #include #include using namespace std; struct BinaryTreeNode { int m_nValue; BinaryTreeNode *m转载 2014-09-12 19:33:48 · 395 阅读 · 0 评论 -
面试题22 已知压入序列 判断弹出序列正不正确
思路:如果下一个弹出的数字刚好是栈顶数字,则直接弹出。若下一个弹出的数字不在栈顶,则把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶为止。若所有的数字都压入栈了仍没有找到下一个弹出的数字,则表明该序列不可能滴一个弹出序列。代码:[cpp] view plaincopy#include "stdafx.h"转载 2014-09-12 19:06:18 · 468 阅读 · 0 评论 -
面试题5 从尾到头打印链表
题目描述:输入一个链表,从尾到头打印链表每个节点的值。输入:每个输入文件仅包含一组测试样例。每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类推。当输入到-1时代表链表输入完毕。-1本身不属于链表。输出:对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行。转载 2014-09-10 11:00:38 · 357 阅读 · 0 评论 -
面试题10 二进制中1的个数
题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。输入:输入可能包含多个测试样例。对于每个输入文件,第一行输入一个整数T,代表测试样例的数量。对于每个测试样例输入为一个整数。。n保证是int范围内的一个整数。输出:对应每个测试案例,输出一个整数,代表输入的那个数中1的个数。样例输转载 2014-09-10 15:10:41 · 458 阅读 · 0 评论 -
面试题3 二维数组中的查找
题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。输入:输入可能包含多个测试样例,对于每个测试案例,输入的第一行为两个整数m和n(1输入的第二行包括一个整数t(1接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,转载 2014-09-10 10:19:28 · 561 阅读 · 0 评论 -
剑指Offer:替换空格
题目1510:替换空格时间限制:1 秒内存限制:128 兆特殊判题:否提交:1697解决:436题目描述:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。输入:每个输入文件仅包含一组测试样例。转载 2014-05-23 19:30:56 · 562 阅读 · 0 评论 -
面试题32 从1到n整数中1出现的次数
统计在从1到n的正整数中1出现的次数1、最直观的想法,求1到n中每个整数中1出现的次数,然后相加即可。而求每个十进制整数中1出现的次数,我们先判断这个数的个位数是否是1,如果这个数大于10,除以10之后再判断个位数是否为1,循环直至求出该整数包含1的个数。代码如下:[html] view plaincopy#include "stda转载 2014-10-08 21:03:30 · 526 阅读 · 0 评论 -
剑指Offer:二维数组中的查找
[cpp] view plaincopy/********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http://ac.jobdu.com/problem.php?pid=1384 * 结果:AC转载 2014-05-23 18:44:15 · 482 阅读 · 0 评论 -
面试题21 包含min函数的栈
题目描述:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。输入:输入可能包含多个测试样例,输入以EOF结束。对于每个测试案例,输入的第一行为一个整数n(1接下来有n行,每行开始有一个字母Ci。Ci=’s’时,接下有一个数字k,代表将k压入栈。Ci=’o’时,弹出栈顶元素。输出:对应每个测试案例中的转载 2014-09-12 16:14:30 · 402 阅读 · 0 评论 -
面试题19 二叉树的镜像
例如:下面两棵树互为镜像思路:先序遍历树的每个结点,若遍历到的结点有子节点,则交换它的两个结点。代码:[cpp] view plaincopy#include "stdafx.h" #include using namespace std; struct BinaryTreeNode转载 2014-09-12 15:35:21 · 397 阅读 · 0 评论 -
面试题4 替换空格20%
一、替换空格请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.",则输出”We%20are%20happy."分析:在空间复杂度尽可能低的情况下,不允许开辟一个新的数组来存放替换空格后的字符串。如果从前往后替换字符串,那么保存在空格后面的字符串肯定会被覆盖。假设字符串的长度为n。对每个空格字符,需要移动后面O(n)个字符,因此对含有O(n)个转载 2014-09-10 10:50:09 · 528 阅读 · 0 评论 -
面试题16 反转链表
题目描述:输入一个链表,反转链表后,输出链表的所有元素。(hint : 请务必使用链表)输入:输入可能包含多个测试样例,输入以EOF结束。对于每个测试案例,输入的第一行为一个整数n(0输入的第二行包含n个整数t(0输出:对应每个测试案例,以此输出链表反转后的元素,如没有元素则输出NULL。样例输入:转载 2014-09-11 21:37:01 · 432 阅读 · 0 评论 -
面试题27 二叉搜索树转换成双向链表
分析:1. 二叉树中,每个结点都有两个指向子结点的指针。2. 在双向链表中,每个结点也有两个指针,分别指向前一个结点和后一个结点。3. 二叉搜索树中,左子结点的值总是小于父结点的值,右子结点的值总是大于父结点的值。4. 将二叉搜索树转换为双向链表时,原先指向左子结点的指针调整为链表中指向前一个结点的指针,原先指向右子结点的指针调整为链表中指向后一个结点的指针。转载 2014-09-13 22:14:08 · 431 阅读 · 0 评论 -
面试题24 数组是不是二叉搜索树的后序优先遍历
分析:在后序遍历得到的序列中,最后一个数字是树的根结点的值,数组中前面的数字可分为两个部分:第一部分是左子树结点的值,它们都比根结点的值小,第二部分是右子树结点的值,它们都比根结点的值大。代码:[cpp] view plaincopy#include "stdafx.h" #include using namespace转载 2014-09-12 20:58:39 · 463 阅读 · 0 评论 -
面试题33 把数组排成最小的数
问题描述:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。 思路:先将整数数组转为字符串数组,然后字符串数组进行排序,最后依次输出字符串数组即可。这里注意的是字符串的比较函数需要重新定义,不是比较a和b,而是比较ab与 ba。如果ab b转载 2014-10-08 21:08:44 · 445 阅读 · 0 评论