- 博客(33)
- 收藏
- 关注
原创 剑指offer面试题34:丑数
题目:我们把只包含因子2、3和5的数称作丑数。求按从小到大的顺序的第1500个丑数。 思路:创建一个排好序的丑数数组,第一个数为1,对应2、3和5分别存在一个丑数乘以2、3和5刚好大于已排序的最大值,即最后一个值,每次更新对应的丑数,依次往后推算,计算1499次。#include <iostream>using namespace std;int Min(int num2, int num3, i
2016-09-21 10:51:28
241
原创 剑指offer面试题33:把数组排成最小的数
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接触的所有数字中最小的一个。 思路:转为字符串,定义比较函数,使用标准库函数排序。#include <algorithm>#include <iostream>#include <sstream>#include <string>#include <vector>using namespace std;bool com
2016-09-21 10:16:23
279
原创 剑指offer面试题32:从1到n整数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。 思路:有规律: 遍历每一位,当前位为0,则在此位上1出现的个数为高位组成的数乘以当前位的位数(十位则乘以10,百位乘以100)。当前位为1,则个数为 高位数*位数 + (低位数+1)。当前位大于1,则个数为(高位数+1)*位数。#include <iostream>#include <vector>using na
2016-09-21 09:51:44
251
原创 剑指offer面试题31:连续子数组的最大和
题目:输入一个整型数组,数组里有整数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度O(n)。 思路:从头到尾逐个累加数组中的每个数字,记录最大值,当和小于0,重新累加,若有大于之前记录的最大值,则更新。#include <iostream>#include <vector>using namespace std;int SubMax(vector<i
2016-09-21 08:28:59
251
原创 剑指offer面试题30:最小的K个数
题目:输入n个整数,找出其中最小的k个数。 思路:与29题类似。#include <iostream>#include <vector>using namespace std;int Partition(vector<int> &num, int length, int begin, int end) { if (num.empty() || length <= 0 || begin < 0
2016-09-20 23:55:19
309
原创 剑指offer面试题29:数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 思路:参考任意第K大数字,排序后,数组中位的数一定是出现次数超过一般的数。O(n(1+1/2+….+1/2k))=O(n)。#include <iostream>#include <vector>using namespace std;int Partition(vector<int> &num, int length, in
2016-09-20 23:36:45
234
原创 剑指offer面试题28:字符串的排列
题目:输入一个字符串,打印出该字符串中字符的所有排列。 思路:全排列,固定一个,排列剩余的,递归。#include <iostream>#include <string>using namespace std;void Permutation(char *pStr, char *pBegin) { if (*pBegin == '\0') cout << pStr << endl;
2016-09-19 15:02:18
195
原创 剑指offer面试题27:二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 思路:二叉搜索树左小右大,中序遍历。当前结点左结点连接左子树最大值,左子树最大值右结点连接当前节点,以当前结点为最大值,以右子树和最大值递归。#include <iostream>using namespace std;struct BinaryTreeNode { int
2016-09-19 14:08:47
198
原创 剑指offer面试题26:复杂链表的复制
题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。struct ComplexListNode{ int m_nValue; ComplexListNode* m_pNext; ComplexListNode* m_pSibling;};思路:分三步,第一步复制对应结点在被复制结点后面,第二步连接
2016-09-19 11:09:45
272
原创 剑指offer面试题25:二叉树中和为某一值得路径
题目:输入一颗二叉树和一个整数,打印出二叉树中结点值得和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的结点形成一条路径。#include <iostream>#include <vector>using namespace std;struct BinaryTreeNode { int m_nValue; BinaryTreeNode *m_pLeft; BinaryT
2016-09-09 13:14:57
182
原创 剑指offer面试题24:二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都不相同。 思路:数组中左边为小于根节点的部分,右边大于根节点。#include <iostream>using namespace std;bool isSearchTree(int *numbers, int left, int right) { bo
2016-09-09 11:21:15
156
原创 剑指offer面试题23:从上往下打印二叉树
题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。广度优先遍历。#include <deque>#include <iostream>using namespace std;struct BinaryTreeNode { int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight;};Bin
2016-09-08 23:38:02
185
原创 剑指offer面试题22:栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。 思路:遍历第二个序列,如果下一个弹出的数字刚好是栈顶数字,则直接弹出。如果不在栈顶,把压栈序列中还没有入栈的数组压入辅助栈,直到把下一个需要弹出的数字压入栈顶为止。如果所有的数字都压入栈了仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列。#include <iostream>#include
2016-09-08 23:22:19
194
原创 剑指offer面试题21:包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。template <typename T> void StackWithMin<T>::push(const T &value) { m_data.push(value); if (m_min.size() == 0 || value < m_min.t
2016-09-08 22:56:38
205
原创 剑指offer面试题20:顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。#include <iostream>using namespace std;void PrintCircle(int numbers[4][4], int columns, int rows, int start) { int endcol = columns - start - 1; int endrow = rows
2016-09-08 22:38:14
201
原创 剑指offer面试题19:二叉树的镜像
题目:完成一个函数,输入一个二叉树,该函数输出它的镜像。 思路:递归的每次交换一个结点的左右子树。#include <iostream>using namespace std;struct BinaryTreeNode { int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight;};BinaryTreeNode
2016-09-08 21:36:50
181
原创 剑指offer面试题18:树的子结构
题目:输入两棵二叉树A和B,判断B是不是A得子结构。#include <iostream>using namespace std;struct BinaryTreeNode { int m_nValue; BinaryTreeNode *m_pLeft; BinaryTreeNode *m_pRight;};BinaryTreeNode *CreateTree() { int a
2016-09-08 21:20:56
244
原创 剑指offer面试题17:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是按照递增排序的。#include <iostream>using namespace std;struct ListNode { int m_nValue; ListNode *m_pNext;};ListNode *CreateList() { int a; cin >> a; ListNode *head;
2016-09-08 20:55:05
230
原创 剑指offer面试题16:反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出翻转后该链表的头结点。#include <iostream>using namespace std;struct ListNode { int m_nKey; ListNode *m_pNext;};ListNode *CreateList() { int a; cin >> a; ListNode *head; h
2016-09-08 09:49:08
238
原创 剑指offer面试题15:链表中倒数第k个结点
题目:输入一个链表,输出该链表中倒数第K个结点。链表的尾结点是倒数第1个节点。 思路:两个指针相差k-1。#include <iostream>using namespace std;struct ListNode { int m_nValue; ListNode *m_pNext;};ListNode *CreateList() { int a; cin >> a; Lis
2016-09-08 09:25:26
161
原创 剑指offer面试题14:调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。 思路:前后两个指针,前面寻找偶数,后面寻找奇数,交换。#include <exception>#include <iostream>using namespace std;bool isEven(int n) { return (n & 1) == 0; }void Reo
2016-09-08 09:06:07
180
原创 剑指offer面试题13:在O(1)时间删除链表结点
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。 思路:可以删除要删除结点的下一个结点。#include <iostream>using namespace std;struct ListNode { int m_nValue; ListNode *m_pNext;};void DeleteNode(ListNode **pListHead, ListNo
2016-09-08 08:38:16
177
原创 剑指offer面试题12:打印1到最大的n位数
题目:输入数字n,按顺序打印出从1最大的n位十进制数。 思路:n没有范围,可能出现大数,采用字符串或者数组表达大数。#include <exception>#include <iostream>using namespace std;void PrintNumber(char *number) { bool isBegining0 = true; int nLength = strlen
2016-09-08 08:35:01
272
原创 剑指offer面试题11:数值的整数次方
题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。#include <exception>#include <iostream>using namespace std;bool g_InvalidInput = false;bool equal(double num1, doubl
2016-09-07 10:34:16
188
原创 剑指offer面试题10:二进制中1的个数
题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。 思路:一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0。#include <exception>#include <iostream>using namespace std;int numberof1(int n) { int count = 0; while (n) { ++count;
2016-09-07 10:03:37
214
原创 剑指offer面试题9:裴波那契数列
题目:一只青蛙一次可以跳上1 级台阶,也可以跳上2级。求该青蛙跳上一个n级台阶共有多少种跳法。#include <exception>#include <iostream>using namespace std;long long Fibonacci(unsigned n) { if (n == 0) return 0; if (n == 1) return 1; lo
2016-09-07 09:50:15
396
原创 剑指offer面试题8:旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。#include <exception>#include <iostream>using namespace std;int Min(int *numbers, int length) { if (numbers == NULL || length <= 0) return -1; int index1 = 0
2016-09-07 09:34:14
162
原创 剑指offer面试题7:用两个栈实现队列
题目:用两个栈实现一个队列。队列声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。#include <exception>#include <iostream>#include <stack>using namespace std;template <typename T> class CQueue {public:
2016-09-06 23:04:29
180
原创 剑指offer面试题6:重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树,输出头结点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;}#include <exception>#include <iost
2016-09-06 22:22:28
162
原创 剑指offer面试题5:从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印出每个节点的值。struct ListNode{ int m_nKey; ListNode* m_pNext;};链表不能反向,从前遍历,从后打印,符合后进先出,用栈。#include <iostream>#include <stack>using namespace std;struct ListNode { int m_nKe
2016-09-06 21:11:56
171
原创 剑指offer面试题4:替换空格
题目:请实现一个函数,把字符串中的每个空格替换成 ” %20 “。例如输入 “We are happy.”,则输出 “We%20are%20happy.”。 思路:当原字符串有足够空间,可以计算出替换后需要的总长度,从后往前碰见空格就替换,否则复制原字符。#include <iostream>#include <string>using namespace std;void replacebla
2016-09-06 10:43:25
162
原创 剑指offer面试题3:二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路:从左下或右上开始查找,每次排除一行或者一列。#include <iostream>using namespace std;bool findnum(int *matrix, int row, int col, int n
2016-09-06 09:55:44
196
原创 剑指offer面试题1:赋值运算符函数
注意:函数的返回类型必须是一个引用,因为只有返回引用,才允许连续赋值传入的参数声明为常量引用,可以提高代码效率,同时赋值运算函数内不会改变传入的实例状态一定要记得释放实例自身已有的内存,否则程序容易出现内存泄露传入的参数和当前的实例是不是同一个实例,如果是同一个,则不用进行赋值操作,直接返回即可。#include <iostream>#include <string>using name
2016-09-06 09:14:35
182
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人