剑指offer
文章平均质量分 66
taxue505
网络 信息安全 互联网
展开
-
构造回文
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?输出需要删除的字符个数。输入描述:输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000. 输出描述:对于每组数据,输出一个整数,代表最少需要删除的字符个数。输入例子:abcdagoogle原创 2016-08-25 22:50:36 · 716 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。注意:相对位置不变,考虑到冒泡排序、插入排序、归并排序等稳定的排序算法。1、冒泡思想:时间复杂度O(n^2)class Solution {public: void reOrderArray(vector原创 2016-07-28 16:17:49 · 298 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。1、先排序再找到数组中出现次数超过一半的数字 时间复杂度O(nlogn)class Solution {public: bool CheckMo原创 2016-07-28 12:17:51 · 595 阅读 · 0 评论 -
最小的k个数
1、时间复杂度O(nlogn)class Solution {public: vector GetLeastNumbers_Solution(vector input, int k) { vector res; if(input.empty()||k>input.size()) return res; sort(inp原创 2016-07-28 00:27:38 · 426 阅读 · 0 评论 -
字符串的组合
题目:输入一个字符串,输出该字符串中字符的所有组合。举个例子,如果输入abc,它的组合有a、b、c、ab、ac、bc、abc。方法一:【递归法求组合】可以考虑求长度为n的字符串中m个字符的组合,设为C(n,m)。原问题的解即为C(n, 1), C(n, 2),...C(n, n)的总和。对于求C(n, m),从第一个字符开始扫描,每个字符有两种情况,要么被选中,要么不被原创 2016-07-26 11:23:02 · 705 阅读 · 0 评论 -
字符串的全排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。正常人的思维是,固定第一个字符,然后依次将后面的字符串与前面的交换,那么排列原创 2016-07-26 00:33:25 · 961 阅读 · 0 评论 -
二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。方法一:递归版解题思路:1.将左子树构造成双链表,并返回链表头节点。2.定位至左子树双链表最后一个节点。3.如果左子树链表不为空的话,将当前root追加到左子树链表。4.将右子树构造成双链表,并返回链表头节点。原创 2016-07-25 22:50:19 · 274 阅读 · 0 评论 -
只出现一次的数字
题目描述一个整数数组里,除了两个数字之外,其他数字都出现了两次。请找出这两个只出现一次的数字。要求:时间复杂度为O(n),空间复杂度为O(1)。(2012 百度)#include using namespace std;unsigned int find_bit1(int num){ int index = 0; while ((num & 1)原创 2016-07-03 17:27:39 · 312 阅读 · 0 评论 -
复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)1、递归法/*struct RandomListNode { int label; struct RandomListNode *nex原创 2016-07-23 23:54:27 · 489 阅读 · 0 评论 -
哈夫曼树
一、哈夫曼树的概念和定义 什么是哈夫曼树?让我们先举一个例子。判定树: 在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序的执行效率。例如,编制一个程序,将百分制转换成五个等级输出。大家可能认为这个程序很简单,并且很快就可以用下列形式编写出来: if(score<60) cout<<"Bad"<<endl;原创 2016-06-15 18:37:11 · 2468 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), le原创 2016-07-23 11:16:35 · 1005 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。递归:class Solution {public: bool VerifySquence(vector& sequence,int l,int r) { if(r-l==0)//边界条件原创 2016-07-23 08:46:16 · 281 阅读 · 0 评论 -
快速排序
实现快速排序的关键在于现在数组中选择一个数字,接下来将数组中的数字分为两部分,比选择的数字小的数字移到数组的左边,比选择的数字大的数字移到数组的右边。代码实现如下:#include #include using namespace std;int RandomInRange(int start, int end){ srand(time(NULL)); return sta原创 2016-06-23 17:50:06 · 415 阅读 · 0 评论 -
连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?原创 2016-08-03 21:04:35 · 287 阅读 · 0 评论 -
两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。1、蛮力法/*蛮力法struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* FindFirstC原创 2016-08-07 22:33:22 · 381 阅读 · 0 评论 -
数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 输入描述:题目保证输入的数组中没有的相同的数字数据范围: 对于%50的数据,size 对于%75的数据,size 对于%100的数据,size输入例子:1,原创 2016-08-07 16:06:44 · 307 阅读 · 0 评论 -
第一个只出现一次的字符
题目描述在一个字符串(11、哈希表class Solution {public: int FirstNotRepeatingChar(string str) { int len=str.size(); if(len10000) return -1; int hashTable[256]={0}原创 2016-08-07 10:55:26 · 341 阅读 · 0 评论 -
丑数
题目描述把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。方法一、逐个判断class Solution {public: bool isUglyNumber(int number) { while(number原创 2016-08-04 16:33:33 · 335 阅读 · 0 评论 -
字符串合法性长度
题目: 仅由三个自负A、B、C构成字符串,切字符串任意连续三个元素不能完全相同。如“ACCCAB”不合法,“ABBCBCA”合法。求满足条件的长度为n的字符串个数。假定不考虑整数溢出,要求时间和空间复杂度不高于O(N)。 提示:使用动态规划、滚动数组、矩阵乘幂#include <iostream>#include <string>using namespace std;int NumO原创 2016-08-28 13:41:03 · 1022 阅读 · 0 评论 -
寻找第K大
有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。测试样例:[1,3,5,2,2],5,3返回:2class Finder {public: int partition(vector& a,int low,int high) {原创 2016-08-02 10:56:52 · 336 阅读 · 0 评论 -
包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。两个辅助栈:/** 1.dataStack为存储数据的栈,minStack为存储最小值的栈;* 2.push的时候将value值与minStack中的top值比较,小则minStack push value,大则push top值*/class Solution {public: s原创 2016-07-21 12:32:48 · 383 阅读 · 0 评论 -
顺时针打印矩阵(旋转矩阵)
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字 1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.解析:注意循环结束的条件:顺时针打印就是按原创 2016-07-21 11:46:15 · 2563 阅读 · 0 评论 -
把数组排成最小的数
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。/* * 解题思路: * 先将整型数组转换成String数组,然后将String数组排序,最后将排好序的字符串数组拼接出来。关键就是制定排序规则。 * 排序规则如下: * 若ab > ba 则原创 2016-08-04 10:40:12 · 249 阅读 · 0 评论 -
二叉树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7原创 2016-07-21 09:55:31 · 256 阅读 · 0 评论 -
从1到n整数中1出现的次数
题目描述求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。方法一、class Solution {public: int numb原创 2016-08-04 08:31:52 · 472 阅读 · 0 评论 -
从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。解题思路:二叉树的层次遍历:1、 定义一个队列:queue 或者stack deque 2、 利用一个队列来记录二叉树的所有节点,每次访问之后都将该节点的子节点,插入到队列当中。3、每次取队列的对首元素;并弹出队列;压入动态数组vectorint> r ;原创 2016-07-22 21:35:42 · 219 阅读 · 0 评论 -
栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)【思路】借用一个辅助的栈,遍历压栈顺序,先讲第一个放入栈中,这里是1,然后判断原创 2016-07-22 21:11:14 · 258 阅读 · 0 评论 -
用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。用两个栈实现一个队列的功能?要求给出算法和思路! <分析>: 入队:将元素进栈A 出队:判断栈B是否为空,如果为空,则将栈A中所有元素pop,并push进栈B,栈B出栈; 如果不为空,栈B直接出栈。 用两个队列实现一个栈的功能?要求给出算法和思路!<分析>: 入栈:将元素进队列A 出栈:判断队原创 2016-04-21 16:57:53 · 389 阅读 · 0 评论 -
旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减序列的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。思路 剑指Offer中有这道题目的分析。这是一道二分查找的变形的题目。旋转之后的数组实际上可以划分成两个有序的子数组:前面子数组的大小都大于后面子数组中的元素 注意到实际上最小的元素就原创 2016-04-21 16:56:05 · 240 阅读 · 0 评论 -
斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。这个题可以说是迭代(Iteration) VS 递归(Recursion), f(n) = f(n-1) + f(n-2),第一眼看就是递归啊,简直完美的递归环境,递归肯定很爽,这样想着关键代码两三行就搞定了,注意这题的n是从0开始的:if(n<=1) return n;else return Fibonacc原创 2016-04-21 16:49:44 · 304 阅读 · 0 评论 -
跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。1.假设当有n个台阶时假设有f(n)种走法。 2.青蛙最后一步要么跨1个台阶要么跨2个台阶。 3.当最后一步跨1个台阶时即之前有n-1个台阶,根据1的假设即n-1个台阶有f(n-1)种走法。 4. 当最后一步跨1个台阶时即之前有n-2个台阶,根据1的假设即n-2个台阶有f(n-2 )种走法。原创 2016-04-21 16:45:06 · 347 阅读 · 0 评论 -
变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。关于本题,前提是n个台阶会有一次n阶的跳法。分析如下: f(1) = 1 f(2) = f(2-1) + f(2-2) //f(2-2) 表示2阶一次跳2阶的次数。 f(3) = f(3-1) + f(3-2) + f(3-3) … f(n) = f(n-原创 2016-04-21 16:39:47 · 334 阅读 · 0 评论 -
阿里笔试第三题
描述 在某个工厂的生成一件产品(A,B, C, …)。其中产品A依赖于半成品和原料(E, F, g…)。其中半成品B又依赖于 其它的半成品或原料(H, I, …)。现在发现原料x发生质量问题,所以由原料x制成的半成品或产品以及直接或间接依赖这些半成品的生成物都要销毁掉。请设计一个C++数据结构来描述这些原料,半成品和最终产品的依赖关系,能够满足以下两个常用请求的速度要求。 一:指定的产品A,列出原创 2016-04-20 21:14:59 · 371 阅读 · 0 评论 -
阿里笔试第二题
描述 Memcached是一款非常流行的开源缓存软件,请根据下面的网络协议说明,实现解析函数。补充题目中的代码片段和结构体定义。程序代码运行于X86 64bit Linux平台。 The format of a packet is a fixed size header followed by three optional variable size components(command - s原创 2016-04-20 21:14:19 · 330 阅读 · 0 评论 -
阿里笔试第一题
问答题1描述 阿里云RDS目标为用户提供高质量的数据库云服务,用户的数据库放到云端后,不仅能够省去自己运维的烦恼,还可以获得很多附加的服务,SQL执行时间分析就是其中的一项。 在这个问题里面,会给出一系列的SQL语句及其执行时间,SQL语句需要以空格为分割符划分为关键词,用户会通过关键词来查询所有含有这个关键词的SQL语句的平均执行时间,如果查询结果不存在,则平均执行时间设为0。 约束:CPU原创 2016-04-20 21:13:04 · 521 阅读 · 0 评论 -
重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。/** * Definition for binary tree * struct TreeNode { * int val; *原创 2016-04-19 20:06:17 · 329 阅读 · 0 评论 -
用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。class Solution{public: void push(int node) { stack1.push(node); } int pop() { if(stack2.empty()) { while(!原创 2016-04-19 20:04:47 · 294 阅读 · 0 评论 -
重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。/* 先序遍历第一个位置肯定是根节点node, 中序遍历的根节点位置在中间p,在p左边的肯定是node的左子树的中序数组,p右边的肯定是node的右子树的中原创 2016-04-21 16:59:49 · 252 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表,从尾到头打印链表每个节点的值。 输入描述: 输入为链表的表头输出描述: 输出为需要打印的“新链表”的表头方法一:链表从尾到头输出,利用递归实现,不使用库函数直接printf输出的时候用递归比较好/*** struct ListNode {* int val;* struct ListNode *next;* L原创 2016-04-21 17:07:39 · 674 阅读 · 0 评论 -
一棵树是否为另一棵树的子结构
题目描述输入两颗二叉树A,B,判断B是不是A的子结构。问题描述:给定两个二叉树的根节点,判断第二树是否是第一个树的子树,如果是返回1,否则返回0.分析:这个是百度的一道笔试题目,属于经典的数据结构问题,子树判断问题,针对这个问题可以采用递归的方法判断, 拿第二个树的每个节点去和第一个树做匹配,如果某个节点匹配成功,就接着往下匹配,否则重新从第原创 2016-06-29 21:45:53 · 1995 阅读 · 0 评论