剑指offer+lintcode程序
htt789
这个作者很懒,什么都没留下…
展开
-
二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 解题思路:因为数组为有序数组,因此从数组的左下角开始寻找,若target的值大于数组值,则列数加1;若target的值小于数组值,则行数减1;因为从左下角开始查找,因此循环条件是行数大于等于0,列数小于等于最大列数。bo...原创 2018-05-14 16:56:23 · 99 阅读 · 0 评论 -
lintcode面试题30:带最小值操作的栈
实现一个带有取最小值min方法的栈,min方法将返回当前栈中的最小值。 你实现的栈将支持push,pop 和 min 操作,所有操作要求都在O(1)时间内完成。 样例 如下操作:push(1),pop(),push(2),push(3),min(), push(1),min() 返回 1,2,1注意:lintcode上pop()函数也要有返回值;思路:把每次的最小元素(数据栈...原创 2018-05-07 10:56:21 · 226 阅读 · 0 评论 -
面试题50:第一个只出现一次的字符
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)解题思路:字符(key)——字符出现的次数(value) -—— >哈希表 1.第一遍遍历数组,找到每个字符对应的次数。辅助数组下标key为数组字符的ASCII码;辅助数组的值value为字符出现的次数。ASCII有256...原创 2018-08-10 11:20:45 · 164 阅读 · 0 评论 -
面试题42:连续子数组的最大和
思路: 1.初始和为0,从第一个数字开始相加,若加入第n个数字后总和为负数,则抛弃之前的n个数字,从第n+1个数字开始重新加。sum=a[i] 2.若和为+,加入下一个数字为负后总和减小但仍让为+,则保存加入负数之前的子数组总和作为暂存最大连续数组和。sum+=a[i] 3.继续加入数字,直到找到最大连续数组和。//不对int sum=0;int max=0;for(int i=...原创 2018-08-22 11:32:35 · 177 阅读 · 0 评论 -
23:链表中环的入口节点
1.从链表开始节点处初始化两个快、慢指针 一个走两步,一个走一步。若重合则存在环形链表 2.判断重合节点是否为空或者重合节点是否为链表的末尾节点,如果是环形链表则不应该有末尾节点(next=NULL表示链表的末尾节点) 3.一个指针从头节点开始,一个指针从重合节点处开始,两个指针以相同的速度开始走,直到相遇则为环形链表入口节点。ListNode* EntryNodeOfLoop(List...原创 2018-09-11 22:00:28 · 152 阅读 · 0 评论 -
二叉树
前序遍历:从根节点,左子树,右子树 若节点为空则遍历到子节点,退出遍历void preorder(tree T){ if(T==NULL) return; cout<<T->data; //先打印 preorder(T->left); preorder(T->right);}中序遍历:左子树,根节点,右子树(...原创 2018-09-11 23:06:12 · 101 阅读 · 0 评论 -
冒泡排序
基本思想:对相邻的元素进行两两比较,顺序相反则进行交换,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序。 最好时间复杂度:O(n),数组本身顺序,仅进行n-1次比较 最坏时间复杂度:O(n^2)数组本身逆序,进行1+2+⋯+n-1=(n(n-1))/2比较和同等级移动 for(int i=0;i...原创 2018-09-03 22:13:18 · 115 阅读 · 0 评论 -
面试题55:二叉树的深度
如果节点为空则返回长度为0 否则返回左子树和右子树中最长的长度+1 输入(根节点)int TreeDepth(TreeNode* pRoot) { if(pRoot==NULL) return 0; return 1+max(TreeDepth(pRoot-&gt;left),TreeDepth(pRoot-&gt;right...原创 2018-09-12 10:37:12 · 152 阅读 · 0 评论 -
堆排序
堆排序 堆:堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆 大顶堆:arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2] 小顶堆:arr[i] <= arr[2i+1] && arr[i] <= arr[2i...原创 2018-09-10 10:15:54 · 138 阅读 · 0 评论 -
面试题48:最长不含重复字符的子字符串
思路: 哈希表 ,字符当做键值,字符串的下标当做实值;哈希表初始化值为-1map<char,int> //char字符,int表示字符在字符串中的下标每个字符对应的最长字符串长度:为当前字符位置减去上一个出现该字符的位置#include<iostream>#include<map>#include<string>using na...原创 2018-09-13 16:38:04 · 176 阅读 · 0 评论 -
lintcode二叉查找树升序输出(中序遍历)
给定两个值 k1 和 k2(k1 &amp;lt; k2)和一个二叉查找树的根节点。找到树中所有值在 k1 到 k2 范围内的节点。即打印所有x (k1 &amp;lt;= x &amp;lt;= k2) 其中 x 是二叉查找树的中的节点值。返回所有升序的节点值。 如果有 k1 = 10 和 k2 = 22, 你的程序应该返回 [12, 20, 22].20/ \ 8 22 / \ 4 ...原创 2018-05-08 15:41:01 · 3445 阅读 · 0 评论 -
lintcode二分查找
给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1。思路:如果数组的中位数mid小于目标数字,则在数组的右侧right继续查找。 如果数组的中位数大于等于目标数字,则在数组的左侧left继续查找。 直到数组中左侧下标等于右侧下表。 复杂度:1)时间复杂...原创 2018-05-07 14:44:50 · 159 阅读 · 0 评论 -
Fizz Buzz 问题(vector添加元素,int转string)
枚举法:查看所有可能给你一个整数n. 从 1 到 n 按照下面的规则打印每个数: 如果这个数被3整除,打印fizz. 如果这个数被5整除,打印buzz. 如果这个数能同时被3和5整除,打印fizz buzz 比如 n = 15, 返回一个字符串数组: [ “1”, “2”, “fizz”, “4”, “buzz”, “fizz”, “7”, “8”, “fizz”,...原创 2018-04-24 15:22:48 · 354 阅读 · 0 评论 -
给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转)
对于字符串 “abcdefg”. offset=0 =&gt; “abcdefg” offset=1 =&gt; “gabcdef” offset=2 =&gt; “fgabcde” offset=3 =&gt; “efgabcd”解题思路:从字符串的末尾移动偏移量个字符到字符串的开头 1.要考虑到字符串为空的状况!!! 2.考虑偏移量大于字符串长度void rotateStr...原创 2018-04-21 17:15:43 · 3079 阅读 · 0 评论 -
合并两个排序的整数数组A和B变成一个新的数组(归并排序)
归并排序:将问题分成一些小的问题然后递归求解,将分的阶段得到的各答案合并在一起。 将两个有序数组合并为一个,给出A=[1,2,3,4],B=[2,4,5,6],返回 [1,2,2,3,4,4,5,6]。 解题思路:从头开始比较两个数列中的数,哪一个小就取出依次存入新的数组中,直到其中一个全部比较完,将另一个数组剩下的部分直接存入新的数组中。vector&amp;amp;amp;lt;int&amp;amp;amp;gt; merge...原创 2018-04-20 21:01:58 · 25078 阅读 · 0 评论 -
lintcode在数组中找到第k大的元素(快速排序)
快速排序思想:先在数组中选择一个数,再把数组中的数字分成两部分,比选择数字小的放在左边,比选择数字大的放在右边。 代码:取数组最右边的数字作为选择的数字,从数组的第一个数字开始与选择数字进行比较,将小于选择数字放入数组左边,当挑选出所有小于选择数子的数时,将选择数字放入中间。则数组剩余的右边部分为大于等于选择数字的所有数。int partition(int data[],int le...原创 2018-04-20 11:36:24 · 7537 阅读 · 0 评论 -
lintcode设计一个算法,找出只含素因子2,3,5 的第 n 小的数
丑数为值只包含因子 2、 3、 5 的数,14不是丑数因为包含因子7./*int min(int a,int b){ if(a&gt;b){ return b; }else{ return a; } }*/C++中存在min函数,可以直接使用 int nthUglyNumber(i...原创 2018-04-19 11:08:38 · 3528 阅读 · 0 评论 -
lintcode计算数字k在0到n中的出现的次数,k可能是0~9的一个值
(数学方法获得)通过与10的余数得到末位,通过与10除去掉末位,构成一个循环,就可以分析一个数的所有位。然后把所有位都加起来(从局部到整体)int digitCounts(int k, int n) { // write your code here int cout=0; for(int i=k;i&lt;=n;i++){ ...原创 2018-04-18 11:05:26 · 358 阅读 · 0 评论 -
面试题29:顺时针打印矩阵
vector<int> printMatrix(vector<vector<int> > matrix) { if(matrix.empty()) cerr<<"wrong input" ; int raw_end=matrix.size()-1; int col_end=mat...原创 2018-07-14 09:54:59 · 126 阅读 · 0 评论 -
面试题27:二叉树的镜像
题目描述:操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 ...原创 2018-07-12 21:14:44 · 128 阅读 · 0 评论 -
面试题26:树的子结构
题目描述:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 解题思路: 1.在树A中查找与树B根节点相同的节点R,从树A的根节点开始遍历,若在树A中找到与树B根节点相同的节点R则继续比较节点R的左右子树是否与B相同。 若A的根节点与B的根节点相同,则比较A的根节点的子树是否与树B相同(第二步); 若A的根节点与B的根节点不同,则继续向下遍历树A...原创 2018-07-12 16:50:47 · 119 阅读 · 0 评论 -
面试题6:从尾到头打印链表
不改变链表结构:“后进先出” 遍历链表,将节点依次添加进栈中。再从栈中依次取出顶点元素作为从后向前遍历链表。 vector<int> result;//存储输出的节点的值 stack<struct ListNode*> nodes;//用栈来存储每个节点 struct ListNode* pNode = hea...原创 2018-06-30 10:20:19 · 133 阅读 · 0 评论 -
面试题9:用两个栈实现队列
题目:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:队列先进先出,栈先进后出。用两个栈实现队列的先进先出。 一个栈用于插入队列元素,一个栈用于删除队列元素: 插入:队列中依次插入元素a,b,c,即在栈stack1中插入a,b,c; 删除:队列中删除元素顺序为a,b,c,栈stack1中删除元素顺序为c,b,a。 因为栈为先入后...原创 2018-06-30 16:44:00 · 137 阅读 · 0 评论 -
3.数组中重复的数字
题目: 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 思路: 依次扫描数组,比较数组下标i及对应的值numbers[i]是否一样,若一样则继续向下比较;若不一样,则比较...原创 2018-06-26 21:41:29 · 120 阅读 · 0 评论 -
面试题10:斐波那契数列+跳台阶
题目:斐波那契数列思路:为了避免重复计算,将中间数保留起来。 当n&amp;gt;1时,上一次加法的参数和结果用于本次。 时间复杂度O(n) 注:数据类型为long longint Fibonacci(int n) { long long result; if(n==0||n==1) result=n; long l...原创 2018-07-09 10:35:47 · 219 阅读 · 0 评论 -
lintcode面试题7:根据前序遍历和中序遍历树构造二叉树
给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树:2 / \ 1 3补充知识:前序排列:根节点,左子节点,右子节点 中序排列:左子节点,根节点,右子节点 解题思路:1.根据前序排列第一个数字确定根节点,并在中序排列中确定根节点位置 2.根据根节点的位置确定中序排列中左子树、右子树,中序排列中根节点之前的数字为左子树,根节点之后的部分...原创 2018-05-04 09:04:44 · 2386 阅读 · 0 评论 -
面试题11:旋转数组的最小数字
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 解题思路: 输入的数组为非减排序数组的旋转,数组分为两个排好序的数组。{3,4,5,1,2}其中前半部分{3...原创 2018-07-09 15:13:06 · 4230 阅读 · 0 评论 -
面试题4:二维数组中的查找
题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路: 若使用目标整数与数组每个数进行比较,时间复杂度O(n^2)。不采用。 考虑到二维数组每行每列的数字具有递增的顺序排序,因此可以根据递增排序的特点进行查找。每次比较删除某一行或某一列。 如图所示,targ...原创 2018-06-27 15:56:49 · 111 阅读 · 0 评论 -
面试题15:二进制z中1的个数
题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 解题思路:整数n减去1,再和n做与运算,把整数最右边的1去掉。int NumberOf1(int n) { int count=0; while(n){//n的所有1变成0,n变成0 n=(n-1)&n; count...原创 2018-07-09 21:35:09 · 183 阅读 · 0 评论 -
面试题31:栈的压入、弹出序列
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 解题思路: 1.建立一个辅助栈,将栈的压入序列压入到辅助栈中 2.压入一个元素就...原创 2018-07-16 10:20:39 · 92 阅读 · 0 评论 -
面试题32:从上往下打印二叉树
思路: 1.将树的根节点加入到队列。 2.取队列的头节点,将头节点对应的数值打印。若头节点有子节点,将子节点添加进队列,并将头节点从队列中弹出。 3.当队列为空时,停止打印。vector<int> PrintFromTopToBottom(TreeNode* root) { vector<int> result; if(root==...原创 2018-07-16 11:17:06 · 109 阅读 · 0 评论 -
面试题16:数值的整数次方
题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 解题思路: 考虑边界值情况:底数,指数分别为正、负、0 底数是0,指数为负 1.底数是0,指数是负->输入无效,错误处理,返回0.0 2.底数是0,指数是0->没有意义,返回0 3.底数是0,指数是正->0 4.底数是1,指数是正、负、0->1...原创 2018-07-10 14:16:43 · 98 阅读 · 0 评论 -
面试题5:替换空格
题目描述: 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 思路: 1.从前到后复制需要创建新的辅助字符串,增加空间复杂度。 2.不创建辅助字符串,从前到后扫描字符串在空格处替换为”%20”三个字符,需要移动空格后的部分字符串,并且每次遇见空格都需要移动后面所有的字符。每次移动时间复...原创 2018-06-28 21:08:03 · 160 阅读 · 0 评论 -
面试题21:调整数组顺序使奇数位于偶数前面
题目描述:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 解题思路: 1.两个指针分别指向数组的前面和后面 2.前面的指针向后移,直到遇到偶数 3.后面的指针向前移,直到遇到奇数 4.交换两个数字(第一个指针总是在第二个指针的前面) 5.前指针继续向后移,后指针...原创 2018-07-11 14:27:49 · 126 阅读 · 0 评论 -
面试题18:删除链表中重复节点
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1-&amp;amp;gt;2-&amp;amp;gt;3-&amp;amp;gt;3-&amp;amp;gt;4-&amp;amp;gt;4-&amp;amp;gt;5 处理后为 1-&amp;amp;gt;2-&amp;amp;gt;5 1.新建p1指针记录新原创 2018-07-11 17:13:26 · 280 阅读 · 0 评论 -
面试题22:链表中倒数第k个节点
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { if(pListHead==NULL||k==0) return NULL; ListNode *p1=pListHead; for(int i=1;i<k;i++){ ...原创 2018-07-11 20:41:42 · 101 阅读 · 0 评论 -
面试题24:反转链表
题目描述: 输入一个链表,反转链表后,输出新链表的表头。解题思路: 反转链表的头节点是原链表的末位节点 设置节点的前一个节点指针pPre,链表反转相当于节点的下一个节点为节点的前一个节点。 1.从头开始遍历链表,反转链表之后,原链表的第一个节点为反转链表的最后一个节点,因此反转后第一个节点的下一个节点为NULL,所以将pPre初始化为NULL。 2.向后遍历原链表(节点指针、前节...原创 2018-07-12 09:49:46 · 241 阅读 · 0 评论 -
面试题25:合并两个排序的链表
题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 测试用例:特殊输入 1.两个链表头节点都为空,返回空 2.有一个链表节点为空,返回另一个链表的头节点 解题思路: 1.合并两个链表从两个链表的头节点开始,比较两个头节点,找到较小的那个作为新链表的头节点。 2.将去掉头节点链表的指针向后移一位,剩下两个链表依然是递增排序的。继续比...原创 2018-07-12 10:54:38 · 105 阅读 · 0 评论 -
设计一个算法,计算出n阶乘中尾部零的个数
32位编译器和64位编译器数据字节数(一个字节=8位) 编译器 int类型:4个字节32位(4*8),寻址空间为2^32,数据范围-2^31~2^31 long long类型:是一种超长整型,8字节64位(8*8),寻址空间为2^64数据范围-2^63~2^63题目描述: 设计一个算法,计算出n阶乘中尾部零的个数 样例:11!=39916800,因此返回2分析: 数字n的阶...原创 2018-04-16 20:38:42 · 444 阅读 · 0 评论