编程艺术、二
知之可否
这个作者很懒,什么都没留下…
展开
-
海量数据搜索、查询
1.有一篇英文文章(也就是说每个单词之间由空格分隔),请找出“csdn”这个单词出现的次数。要求效率最高,并写出算法的时间级。方法一: 假设不区分大小写,由于英文字母有26个,因此,可以将单词映射为数字。csdn被映射成: ( ‘c ‘- ‘a ‘)*32*32*32+( ‘s ‘- ‘a ‘)*32*32+( ‘d ‘- ‘a ‘)*32+( ‘n ‘- ‘a ‘) 即:( ‘c ‘转载 2016-05-13 16:18:30 · 1762 阅读 · 0 评论 -
剑指offer:滑动窗口的最大值
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1原创 2016-05-05 21:17:40 · 654 阅读 · 0 评论 -
剑指offer:二叉搜索树的第k个结点
题目描述给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。递归/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) :原创 2016-05-05 15:56:19 · 1359 阅读 · 0 评论 -
剑指offer:按之字形顺序打印二叉树
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : va原创 2016-05-05 09:58:27 · 523 阅读 · 0 评论 -
剑指offer:把二叉树打印成多行
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};原创 2016-05-04 22:36:01 · 453 阅读 · 0 评论 -
剑指offer:对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL),原创 2016-05-04 22:05:13 · 522 阅读 · 0 评论 -
剑指offer:二叉树的下一个结点
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。using namespace std;/*struct TreeLinkNode { int val; struct TreeLinkNode *left; struct TreeLinkNode *right; stru原创 2016-05-04 21:37:25 · 431 阅读 · 0 评论 -
剑指offer:删除链表中重复的结点
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5跟 lintcode中这题不同 http://www.lintcode.com/en/problem/remove-duplicates-from-sorted-list/# 本题要求重复的全部去掉!/*struct原创 2016-05-04 20:41:15 · 374 阅读 · 0 评论 -
剑指offer:字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。 输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符。class Solution{public: Solution() :index(0){原创 2016-05-04 16:23:25 · 528 阅读 · 0 评论 -
剑指offer:表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。class Solution {public: bool isNumeric(char* string) { i原创 2016-05-04 11:59:27 · 1083 阅读 · 0 评论 -
剑指offer:链表中环的入口结点
题目描述一个链表中包含环,请找出该链表的环的入口结点。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* EntryNodeOf原创 2016-05-04 17:20:15 · 476 阅读 · 0 评论 -
剑指offer:数值的整数次方
方法一:见幂模class Solution {public: double Power(double base, int exponent) { if(base==0 && exponent<0){ throw new std::logic_error("error input"); } if(exponent==0)原创 2016-04-21 17:33:50 · 602 阅读 · 0 评论 -
剑指offer:矩阵中的路径
题目描述请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串”bcced”的路径,但是矩阵中不包含”abcb”路径,因为字符串的第一个字符b占据了矩原创 2016-05-05 22:29:52 · 652 阅读 · 0 评论 -
剑指offer:反转链表
题目描述输入一个链表,反转链表后,输出链表的所有元素。1.非递归/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public:原创 2016-04-22 23:24:41 · 523 阅读 · 0 评论 -
卡特兰数Catalan
1.卡特兰数的性质其实重要的就两个公式:1和3.公式1是卡特兰数的通项公式。 公式2是卡特兰数的递归公式。注意递推公式是C n+1=… 通常是发现问题可以用卡特兰数的递推公式来解决,从而想到卡特兰数。2.经典问题1.出栈次序问题。 一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列? 解:对于每一个数来说,必须进栈一次、出栈一次。我们把进栈设为状态‘1’,出栈设为状态‘原创 2016-02-02 21:45:58 · 2411 阅读 · 1 评论 -
剑指offer:二叉树中和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(原创 2016-04-24 21:32:26 · 467 阅读 · 0 评论 -
剑指offer:重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。/** * Definition for binary tree * struct TreeNode { * int val; * T原创 2016-06-16 16:08:07 · 328 阅读 · 0 评论 -
剑指offer:旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。class Solution {public: int minNumberInRotateArray(原创 2016-06-16 10:57:04 · 508 阅读 · 0 评论 -
剑指offer:二叉搜索树的后序遍历序列
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。class Solution {public: bool VerifySquenceOfBST(vector<int> sequence) { if(sequence.size()==0){ return原创 2016-04-24 20:05:50 · 365 阅读 · 0 评论 -
剑指offer:栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。class Solution {public: bool IsPopOrder(vector<int> pushV,vector原创 2016-04-24 14:48:06 · 412 阅读 · 0 评论 -
剑指offer:树的子结构
题目描述输入两颗二叉树A,B,判断B是不是A的子结构。这题有点难注意if (pRoot2 == NULL){ return true;}if (pRoot1 == NULL){ return false;}注意着两个顺序不能换,换了就出错。/*struct TreeNode { int val; struct TreeNode *left; struc原创 2016-04-23 15:44:35 · 399 阅读 · 0 评论 -
剑指offer:数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。class Solution {public: Solution() :cnt(0){} void Insert(int num) { cnt++; if原创 2016-05-06 11:39:27 · 531 阅读 · 0 评论 -
剑指offer:正则表达式匹配
题目描述请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配class Solution {public: bool match(char* str,原创 2016-05-04 11:11:59 · 1565 阅读 · 5 评论 -
剑指offer:构建乘积数组
题目描述给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…A[i-1]*A[i+1]…*A[n-1]。不能使用除法。class Solution {public: vector<int> multiply(const vector<int>& A) { int len = A.size();原创 2016-05-04 10:21:45 · 512 阅读 · 0 评论 -
剑指offer:数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。class Solution {public: // Parameters: // number原创 2016-05-04 09:56:17 · 1339 阅读 · 0 评论 -
剑指offer:丑数
题目描述把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。class Solution {public: int GetUglyNumber_Solution(int index) { //注意这种非法的输入 if(index<=0)原创 2016-04-27 22:18:42 · 516 阅读 · 0 评论 -
剑指offer:把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。class Solution {public: /* static bool myCmp(string str1, string str2){ string cat1 = str1 +原创 2016-04-27 16:37:23 · 362 阅读 · 0 评论 -
剑指offer:最小的K个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。方法一O(n)改变输入,适合小数据class Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { int len = input.si原创 2016-04-26 22:58:32 · 395 阅读 · 0 评论 -
剑指offer:数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。方法1利用快排的partionclass Solution {public: int MoreThanHalfNum_Solution(vector<int> numbers原创 2016-04-26 21:22:09 · 504 阅读 · 0 评论 -
剑指offer:二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。1.递归/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(原创 2016-04-25 22:28:33 · 350 阅读 · 0 评论 -
剑指offer:复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。/*struct RandomListNode { int label; struct RandomListNode *next, *random; RandomListNode(int x) : label(x), next(NULL)原创 2016-04-25 11:53:46 · 359 阅读 · 0 评论 -
哈夫曼树
哈夫曼树概念哈夫曼(Huffman)树又称最优二叉树。它是n个带权叶子结点构成的二叉树中,带权路径长度WPL最小的二叉树。因为构造这种树的算法是最早由哈夫曼于1952年提出的,所以被称之为哈夫曼树。二叉树的性质二叉树中有五点性质非常重要,需要记住。 性质1:在二叉树的第 i 层上至多有2^(i-1)个结点 性质2:深度为k的二叉树至多有2^k-1个结点 性质3:对任何一颗二叉树T,如果其终端结原创 2015-11-20 16:00:34 · 8384 阅读 · 0 评论 -
贪心法:最大不相交区间数
数轴上有n个区间[ai,bi],要求选择尽量多个区间,使得这些区间两两没有公共点。贪心策略:按照b1按bi排序后,接下来一定要选第一个区间;以后就依次选跟前面已选的区间不相交的区间;证明过程详见《算法竞赛入们经典》P232题目描述:学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办。小刘的工原创 2015-11-17 10:04:57 · 2824 阅读 · 0 评论 -
贪心法:乘船问题
描述 进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别。一条独木舟最多只能乘坐两个人,且乘客的总重量不能超过独木舟的最大承载量。我们要尽量减少这次活动中的花销,所以要找出可以安置所有旅客的最少的独木舟条数。现在请写一个程序,读入独木舟的最大承载量、旅客数目和每位旅客的重量。根据给出的规则,计算要安置所有旅客必须的最少的独木舟条数,并输出结果。输入 第一行输入s,表示测试数据的组数原创 2015-11-15 10:55:24 · 2909 阅读 · 0 评论 -
剑指offer:数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。class Solution {public: int InversePairs(vector<int> data) { int len = data.size(); if (len == 0){ retur原创 2016-04-28 15:04:20 · 511 阅读 · 0 评论 -
剑指offer:两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* FindFirstCo原创 2016-04-28 15:45:11 · 400 阅读 · 0 评论 -
剑指offer:平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。使用后序遍历记录深度的方式,避免重复遍历class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { int depth=0; return helper(pRoot, depth); }private: bool hel原创 2016-05-01 21:58:59 · 335 阅读 · 0 评论 -
剑指offer:不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。class Solution {public: int Add(int num1, int num2) { int sum, carry; do{ sum = num1^num2; carry = (num1&num2原创 2016-05-03 11:01:33 · 332 阅读 · 0 评论 -
剑指offer:求1+2+3+...+n
题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。方法一:构造函数class helper {public: helper(){ sum += (++n); } static void reset(){ n = 0; sum = 0;原创 2016-05-03 10:40:39 · 810 阅读 · 0 评论 -
剑指offer:孩子们的游戏(圆圈中最后剩下的数)
题目描述每年六一儿童节,NowCoder都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为NowCoder的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数….这样下原创 2016-05-02 22:02:13 · 451 阅读 · 0 评论