编程题
Jiang_Jinchao的个人博客
踏实工作,快乐生活!
展开
-
【刷题剑指offer】数组中的逆序对
思路:先把数组分隔成子数组,统计出子数组内部的逆序对数目,然后再统计出两个相邻子数组之间的逆序对的数目,在统计逆序对的过程中,还需要对数组进行排序。如果对排序算法很熟练,我们不难发现这个排序的过程实际上就是归并排序。因此可以基于归并排序写出如下代码:int InversePairs(int *data,int length) { if(data==NULL||length<0)原创 2017-07-13 21:23:15 · 165 阅读 · 0 评论 -
【刷题剑指offer】字符串的排列
题目:输入一个字符串,打印出该字符中字符的所有排列。例如输入字符串abc,则打印出由字符a\b\c所能排列出来的所有字符串abc\acb\bac\bca\cab\cba思路:递归实现。分为两步:1、首先求出所有可能出现在第一个位置的字符,即把第一个字符和后面所有字符交换。2、固定第一个字符,求后面所有字符的排列。那么后面的字符也可以分为两部分,第一个字符和后面的所有字符,我们重复1、2原创 2017-07-18 20:51:47 · 145 阅读 · 0 评论 -
【每日算法】快速排序
思路:partitionvoid quicksort(int arr[], int length, int l, int r){ if (l == r) return; int p = partition(arr, length, l, r); if (p > l) quicksort(arr, length, l, p - 1); if (p < r) quicksort(原创 2017-07-23 16:18:50 · 205 阅读 · 0 评论 -
多态的实现机制
1、什么是多态?多态可以简单的概括为“1个接口,多种方法”,在程序运行的过程中才决定调用的机制程序实现上是这样的,通过父类指针调用子类的函数,可以让父类指针有多种形态。通过虚函数实现。子类重新定义父类虚函数的做法称为“覆盖”。(与重载区别:重载是指存在多个同名函数,而这些函数的参数表不同)2、实现机制举个例子:#include class animal{publi转载 2017-07-16 16:02:18 · 773 阅读 · 0 评论 -
【刷题剑指offer】第一个只出现一次的字符
题目:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出‘b'。思路:定义一个哈希表,键值是字符,而值是该字符出现的次数。C++模板类中没有哈希表的实现,因此我们考虑如何实现一个简单的哈希表,字符是一个1字节8位的数据类型,因此总共256种可能,因此我们定义一个长度为256的数组就可以根据字符的ASCII作为下标存储每个字符的次数,最后查找第一个出现一次的字符即可。原创 2017-07-16 17:46:14 · 280 阅读 · 0 评论 -
【刷题剑指offer】数组中出现次数超过一半的数字
思路:1、用快速排序算法中的Partition函数。因为如果数组中出现次数超过数组长度一半的数字,那么当数组排好序后,这个数字肯定是数组的中间下标对应的数,但使用快排时间效率为O(nlogn),这里我们只需要使用partition函数即可,如果partition返回的index是middle,那么就是结果了,如果index大于middle,那么在左边递归,如果index小于middle,那么在右边原创 2017-07-17 11:42:24 · 237 阅读 · 0 评论 -
【刷题剑指offer】最小的k个数
思路:1、用Partition函数,只是不是和中间的比较而是和第k个比较2、最大堆。在最大堆中,根节点的值总是大于它的子树中任意节点的值。于是我们每次可以在O(1)得到已有的k个数字中的最大值,但需要O(logk)时间完成删除以及插入操作。使用STL的set和multiset实现原创 2017-07-17 11:59:19 · 117 阅读 · 0 评论 -
【刷题剑指offer】数组中连续子数组的最大和
题目:输入一个整数型数组,数组中有正数也有负数。数组中一个或连续的多个整数组成一个子数组,求所有子数组中和最大为多少。思路:如果当前和为负数,那么把当前和重置为下一个整数,如果当前和为整数,那么当前和加上下一个整数,设置一个变量保存最大和,每次比较都要更新最大和。和动态规划思路相似。代码:int Findmax(int *data, int length){ if (data ==原创 2017-07-17 17:31:20 · 122 阅读 · 0 评论 -
【每日算法】插入排序&选择排序&冒泡排序
void insertsort(int arr[], int length){ if (arr = NULL || length <= 0) return; for (int i = 1; i < length; i++) { int key = arr[i];//待插入的元素 int j = i - 1; while (j >= 0 && arr[j] > key)原创 2017-07-23 16:47:14 · 208 阅读 · 0 评论 -
【每日算法】归并排序
思路:1、分解:将n个元素分成各含n/2个元素的子序列; 2、解决:用归并排序法对两个子序列递归地排序; 3、合并:合并两个已排序的子序列以得到排序结果。归并排序的时间复杂度为O(n logn),空间复杂度为O(n)。归并排序是稳定的代码:void mergesort(int arr[], int l, int r){ if (arr == NULL || l原创 2017-07-23 17:37:36 · 160 阅读 · 0 评论 -
【每日算法】堆排序
1、堆:堆数据结构是一种数组对象。对于表示堆的数组arr[0…n-1],我们以arr[0]为根,给定某个节点下标i,令其父节点和左右后代节点的下标为:parent(i) = (i-1)/2;left(i) = 2*i+1;right(i) = 2*i+2;堆分为最大堆和最小堆,上面就是最大堆,特点就是:除根节点以外的每个节点i,都有arr[ parent(i) ]原创 2017-07-23 19:31:57 · 143 阅读 · 0 评论 -
【刷题剑指offer】丑数
题目:我们把只包含因子2、3、5的数称为丑数。求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做成第一个丑数。思路:1、逐个判断每个整数是不是丑数,直观但不够高效,因为对于一个数不管是不是丑数我们都要进行计算。原创 2017-07-14 19:59:45 · 257 阅读 · 0 评论 -
【刷题剑指offer】两个链表的第一个公共节点
思路:先统计出两个链表的长度M和N,然后让长链表先走M-N步,然后一起走,每步都比较两个链表的节点是否相同,如果相同那么跳出循环,返回第一个公共节点代码:struct ListNode{ int val; ListNode* next;};int countLength(ListNode*phead){ unsigned int len = 0; ListNOde*pNode原创 2017-07-18 20:30:29 · 201 阅读 · 0 评论