自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(74)
  • 资源 (1)
  • 收藏
  • 关注

原创 【刷题之路】宝石与石头 from leetcode

给定字符串J代表石头中宝石的类型,和字符串S代表你拥有的石头。S中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。J中的字母不重复,J和S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。示例 1:输入: J = "aA", S = "aAAbbbb"输出: 3示例 2:输入: J = "z", S = "ZZ"...

2019-07-01 16:21:29 137 1

原创 局部最小值位置练习题

定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]是局部最小;如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小;如果0<i<N-1,既有arr[i]<arr[i-1]又有arr[i]<arr[i+1],那么arr[i]是局部最小。 给定无序数组arr,已知arr中任意两个相邻的数都不

2016-09-20 11:10:05 499

原创 【刷题之路】数组中重复的数字

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。注意到题中有非常重要的条件,n个数的范围在0~n-1范围内。所以就可以考虑用数组本身做一个记录是否出现数组的标志。首先遍历数组

2016-08-08 11:18:03 573

原创 【刷题之路】最小的K个数

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。最优方法可以做到n*log(k)。做法就是使用堆排序,只维护一个规模为k的大根堆,之后遍历所有的数字,一旦后面数字比堆顶小,则交换两数,并重新调整大根堆,遍历完成后堆中元素就是最小的k个数(但是这K个数不一定是排序的)代码如下:class Solution {pu

2016-07-29 17:59:48 388

原创 【刷题之路】不使用四则运算做加法

不适用四则运算则必然是使用位运算,三步走:第一步:将两个数按位相加,不算进位,这种操作实际上就是两数求异或;第二步:求两数的进位,将两数做与运算,这样有进位的位上就是1,没有进位的就是0,然后将这个结果左移一位,这样1就到了正确的进位位置;第三部:将上面两个结果作为新的输入再次运算,直到没有进位,则循环停止。代码如下:class Solution {public:   

2016-07-29 14:46:15 307

原创 【刷题之路】求1+2+3+...+n

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)限制了所有循环语句,自然想到了递归实现限制了所有的判断语句,如何结束递归成为难题。这时需要借用逻辑运算来跳出递归,代码如下:class Solution {public:    int Sum_Solution(int n) {   

2016-07-29 14:14:27 442

原创 【刷题之路】扑克牌顺子

给出五张牌,判断是不是顺子,大小王再数组中认为是0,可以当任何牌。看似是要排序之后判断是不是顺子,实际上可以完全从顺子的定义入手,去判断这组数字可否成为顺子。五个数可否成为顺子的条件:1、最大值与最小值差值不大于5(因为有大小王的规则,不能严格定义成最大值与最小值差值为4);2、不能有重复的数字;3、扑克牌最小是1,最大是13;只要一个数组满足这三个条件,则一定是顺子,这样就可以的时间

2016-07-29 11:30:13 399

原创 【刷题之路】翻转单词顺序列

例如将字符串“student. a am I”反转为“I am a student.”与之前的左旋转一样,只不过这次是根据空格来反转,同样的首先按空格一次翻转每个单词,之后对整个字符串进行反转class Solution {public:    string ReverseSentence(string str) {        int i;        int lef

2016-07-29 10:17:43 275

原创 【刷题之路】左旋转字符串

汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。字符串旋转题目,旋转的定义为:abcd->dcba。左移操作分三步:1、前段旋转,2、后段旋转,3、整个旋转,即可达到左移N位的目的,

2016-07-28 16:49:46 262

原创 【刷题之路】和为S的两个数字

输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的由于固定是两个数字,则策略应该是:首先两个指针定在头尾,若和大于sum,则尾指针前移,若和小于sum,头指针后移,找出所有即可。代码如下:class Solution {public:    vector FindNumbersWithSum(vector

2016-07-28 16:33:09 255

原创 【刷题之路】和为S的连续正数序列

输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序设定一个类似于变长滑动窗的结构,首先窗中只有,1,2两个元素,若窗中元素和小于目标,则窗想右增长一位,若窗中元素和大于目标值,则窗左边缩减一位,直到窗的左边大于目标值一半或者窗的右边等于目标值,则遍历停止,代码如下:class Solution {public:    vector >

2016-07-28 15:33:18 205

原创 【刷题之路】数组中只出现一次的数字

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字两个相同的数异或运算结果为0,任何数与0异或的结果都是自己。假如数组中只有一个只出现一次的数,则只需要对整个数组做异或运算,结果也就是那一个只出现一次的数。现在数组中有两个只出现一次的数,则需要将数组分组,将两个数分道不同的组,并且要求其余的成对分到两组。结合代码说明:class Solution {

2016-07-28 11:39:14 329

原创 【刷题之路】平衡二叉树

输入一棵二叉树,判断该二叉树是否是平衡二叉树。平衡二叉树的定义:左右子树节点差不大于1,并且左右子树也都是平衡二叉树实际上与计算二叉树深度异曲同工,对于每一个节点,需要返回左右子树的最大深度,并且比较差值,并返回左右子树的最大值作为当前节点的深度代码如下:class Solution {public:    bool IsBalanced_Solution(TreeNode

2016-07-28 11:24:35 327

原创 【刷题之路】二叉树的深度

输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度二叉树的遍历一般是递归实现,求最大深度只要不断返回左右子树遍历的最大值即可,代码如下:/*struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int

2016-07-28 10:54:00 289

原创 【刷题之路】数字在排序数组中出现的次数

统计一个数字在排序数组中出现的次数排序数组中查找常用二分法查找,为了寻找出现次数,稍微改动二分法查找,找到目标数字第一次出现位置以及最后一次出现位置即可。代码如下:class Solution {public:    int GetNumberOfK(vector data ,int k) {        int first,last;        int numb

2016-07-28 10:37:21 367

原创 【刷题之路】归并排序

归并排序的思想为分而治之。首先将整个数组,分为n份,每一份中有一个元素,之后两两合并,每一分钟有两个元素,排序,之后再两两合并,每一份中有四个元素,排序,最后直至合并完成,很明显是利用递归的思想来进行排序,代码如下:class MergeSort {public:    int* mergeSort(int* A, int n) {        // write code her

2016-07-25 14:59:54 365

原创 【刷题之路】第一个只出现一次的字符

在一个字符串(1直观的,利用计数的思想,遍历记录所有字符以及其最后一个出现的位置,若只出现一次,计数为1,然后比较最前位置即可,代码如下:class Solution {public:    int FirstNotRepeatingChar(string str) {        int count[52]={0};        int index[52]={0};

2016-07-25 10:44:37 311

原创 【刷题之路】丑数

把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。如果遍历整数寻找第N个丑数,无疑是非常浪费计算的,例如第1500个丑数就达到了8亿多,中间大部分计算是无用的所以,自己按顺序制造第N个丑数才是正解。实际上这个过程并不难,首先,要按顺序找到第N个丑数,那么某一个丑数

2016-07-22 11:40:35 423

转载 【刷题之路】整数中1出现的次数

1~13中包含1的数字有1、10、11、12、13因此共出现6次,以此类推。编程之美上给出的规律:1. 如果第i位(自右至左,从1开始标号)上的数字为0,则第i位可能出现1的次数由更高位决定(若没有高位,视高位为0),等于更高位数字X当前位数的权重10i-1。2. 如果第i位上的数字为1,则第i位上可能出现1的次数不仅受更高位影响,还受低位影响(若没有低位,视低位为0)

2016-07-22 10:50:19 491

原创 【刷题之路】连续子数组的最大和

常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)首先,从头开始求和,若一直为正数,则不断更新最后结果,这样如果遇到负数,就记录下了之前的最大值第二,如果求和的结果小于零,那么之前的所有数的如果继

2016-07-22 09:52:36 320

原创 【刷题之路】数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0可以利用累计投票来实现时间复杂度为n的算法,具体过程如下:设定flag为第一个元素,初始化count=1;将后一个元素与flag比较,并做如下判断:1、若下一个元素与flag相同,

2016-07-21 15:22:09 363

原创 【刷题之路】字符串排序

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出数组全排列问题,经典解法逐位交换递归实现,首先,第一位与第二位交换,将交换后的字符串再次传入函数中,函数中从第二位开始,然后与之后的交换,再次递归,直到全部递归完成,所有的排列则都有的。代码如下:

2016-07-21 11:08:08 507

原创 【刷题之路】复杂链表的复制

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head三步走:第一步,复制链表节点A->B->C 变为  A->A'->B->B'->C->C'  ,目的为了第二步第二步,重建random指针位置,此时,复制后的指针指向的位置应该就是原节点random指针指向节点的next,这样就重建了复杂链表第

2016-07-18 14:55:49 243

原创 【刷题之路】二叉树中和为某一值的路径

输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径问题难点在于, 为了确定某一条路径是否符合要求,需要走完整条路来确定是否要保留之前走的路径点我们采取递归寻找的方法,将走过的路径全部保留,如果最后发现这条路并不是我们需要的,则将已经存入的路径点弹出,如果满足,则将整条路径返回代码如下/*st

2016-07-18 12:10:53 871

原创 【刷题之路】二叉搜索树的后序遍历序列

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。二叉搜索树的定义是:左子树节点再根据后续遍历的定义,左右根的遍历方式,则数组的最后一个节点为树的根节点,若这个数组是一个搜索二叉树的后序遍历,则前面的数组必然分为两部分,前部分都小于根节点,后部分都大于根节点。前后部分右分别组成一颗二叉搜索树,递归实现十

2016-07-18 10:49:15 263

原创 【刷题之路】按层打印二叉树

从上往下打印出二叉树的每个节点,同层节点从左至右打印利用一个双端队列来实现会比较简便。将双端队列第一个元素的左右节点插入到队列末尾,并且同时打印头节点并弹出,循环既可以实现一个按层打印二叉树的过程,代码如下/*struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(in

2016-07-18 10:05:29 965

原创 【刷题之路】栈的压入、弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)问题关键点,pop每次弹出的是栈顶元素,push的顺序是固定的,pop穿插在push中,只要在合适

2016-07-15 14:37:45 203

原创 【刷题之路】调整数组顺序使奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。由于要求相对位置不变,比较直观的一种方法是新建两个数组,遍历原始数组时将奇偶数分开存放,再组合即可如果不允许额外空间,可以考虑使用插入排序的思想,从第二个数开始遍历,如果这个数是奇数,则遍历他之前的所有数,如果有偶数,则

2016-07-14 11:19:54 213

原创 【刷题之路】包含min函数的栈

定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。得到一个栈中的最小值,我们需要另一个栈作为辅助,当栈为空时,压入的第一个数字则为最小值,同时将该数字压入辅助栈来第二个数字时,与辅助栈栈顶比较,若小于栈顶则压入辅助栈作为新的最小值,若大于栈顶则再次压入栈顶值,表示此时最小值仍然为之前的值代码如下class Solution {    stack data;

2016-07-14 10:57:07 156

原创 【刷题之路】二叉树的镜像

操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5有点类

2016-07-14 10:35:57 179

原创 【刷题之路】树的子结构

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)递归寻找A树每一节点,如果跟B树头结点相同,则开始比较A,B树后面节点,如果B树遍历完成返回true,则是子结构/*struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int

2016-07-14 10:29:06 253

原创 【刷题之路】合并两个排序链表

输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。类似于合并两个排序数组,但是数组合并是从后往前,链表遍历只能从前往后。大体方法不变代码如下/*struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}};

2016-07-14 09:55:47 200

原创 【刷题之路】反转链表

经典算法题,反转题直观的可以用栈来完成,但是浪费空间,一般链表题都要求直接用指针操作。反转链表需要用到三个指针,pre指向当前节点反转后指向的节点,cur表示当前节点,next指向当前节点之后的节点以避免链表断裂代码如下/*struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x),

2016-07-14 09:42:59 227

原创 【刷题之路】数值的整数次方

给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方一个数字的整数次方,可以转化为二进制乘法例如3^7可以转化为二进制3^1011=3^1000*3^10*3^1就可以利用位操作快速算出幂,代码如下class Solution {public:    double Power(double base, int expo

2016-07-13 16:07:58 239

原创 【刷题之路】二进制中1的个数

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示利用class Solution {public:     int  NumberOf1(int n) {         int i,k,res=0;         for(i=0;i             k=1             if(n&k) res++;         } 

2016-07-13 15:49:47 189

原创 【刷题之路】贴瓷砖问题

我们可以用2*1的小瓷砖横着或者竖着去覆盖整间屋子。请问用n个2*1的小瓷砖无重叠地覆盖一个2*n的屋子,总共有多少种方法?利用逐步递推即可发现规律当n=1时,res=1当n=2时,res=2当n=3时,进行分析,第一款砖若是竖着放,则剩下一个2*2的空间,问题转化为n=2;第一块砖若是横着放,则第二块砖的位置也固定了,剩下一个2*1的空间,问题转化为n=1,所以可得f(3)=f(

2016-07-13 15:46:20 1861

转载 【刷题之路】跳台阶进化版

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。关于本题,前提是n个台阶会有一次n阶的跳法。分析如下:f(1) = 1f(2) = f(2-1) + f(2-2)         //f(2-2) 表示2阶一次跳2阶的次数。f(3) = f(3-1) + f(3-2) + f(3-3) ...

2016-07-13 15:19:39 257

原创 【刷题之路】二叉树遍历

由一个前序以及中序遍历重建一颗二叉树经典二叉树题目,由前序遍历可知前序遍历的第一个数为当前树的头结点;得知当前树的头结点后,由中序遍历可知左右子树的节点数量;这样可以将前序遍历,去除头结点后,分为两部分,两部分的第一个数分别为左右子树的头结点;递归实现,根据函数输入不同有不同写法,大体算法一致/** * Definition for binary tree * stru

2016-07-13 12:02:17 283

原创 【刷题之路】生成杨辉三角/帕斯卡三角

杨辉三角或叫帕斯卡三角,定义可以百度百科一下class Solution {public:    vector> generate(int numRows) {        vector temp;        vector> res;        int i,j;        for(i=1;i            for(j=i-1;j>=2;j--)

2016-06-29 10:32:14 563

原创 【刷题之路】最短子数组问题

对于一个数组,请设计一个高效算法计算需要排序的最短子数组的长度。给定一个int数组A和数组的大小n,请返回一个整型,代表所求序列的长度。保证A中元素均为正整数。我们需要确定最短子数组,也就是说我们需要找到需要排序的数字,同时排除应该站在原地的数字。首先从前往后遍历,不断记录下遍历的最大值,当之后的数字比他小时,记录位置,我们需要记录下最右的位置,也就是说这个数必定是在这个记

2016-06-13 11:11:45 769

wav切割程序

输入音频名称,起止点时间,输出名称,即可 写个脚本调用吧

2017-10-25

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除