![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
pplin
这个作者很懒,什么都没留下…
展开
-
发现一个编程练习的地方
http://ac.jobdu.com/ 是一个练习编程的好地方啊,推荐给大家原创 2014-07-16 21:44:49 · 396 阅读 · 0 评论 -
算法19:实现 char* strtok(char* str, const char* delimeter)
算法分析strtok是用来分隔字符串,首次使用strtok时,str指向待分隔的字符串;后续调用要将str置为NULL,直至返回值为NULL。 因此,需要一个static变量指向str变量。c++代码//str:待分隔的源字符串//delimeter:分隔符char* strtok(char* str, const char* delimeter){ //静态变量,指向带分隔的源字符原创 2017-03-22 14:23:58 · 748 阅读 · 0 评论 -
算法23:strcpy 重写
c++代码char* strcpy(char* dest,const char* src){ assert(src != NULL && dest != NULL);//[1] char* destRet = dest;//[2] while((*destRet++ = *src++) != '\0');//[3] return destRet;}注意事项[1]要进行原创 2017-03-30 10:12:57 · 397 阅读 · 0 评论 -
算法24:智能指针的原理和使用
c++代码template <typename T>class SmartPtr{public: SmartPtr(T* p = 0):ptr(p),count(new int(1)){} //复制构造函数 SmartPtr(const SmartPtr& sp):ptr(sp.ptr),count(sp.count) { ++count;原创 2017-03-30 17:39:42 · 362 阅读 · 0 评论 -
算法20:两个排序数组merge后的中值
算法分析:思路一:遍历计数法 此题可以变为求:有序数组A的长度是m,有序数组B的长度是n,返回A和B合并后的第k个值。通过遍历两个有序数组,采用计数的方法,当计数到第k个值时,返回数组合并后的第k个值。时间复杂度为O(m+n),空间复杂度为O(1)。c++代码如下//aBuffer:有序数组a//aLen:有序数据a的长度//bBuufer:有序数组b//bLen:有序数组b的长度//k:原创 2017-03-24 09:45:04 · 378 阅读 · 0 评论 -
转载:
转载自:http://www.cnblogs.com/absfree/p/5508570.html一、概述 符号表是一种用于存储键值对(key-value pair)的数据结构,我们平常经常使用的数组也可以看做是一个特殊的符号表,数组中的“键”即为数组索引,值为相应的数组元素。也就是说,当符号表中所有的键都是较小的整数时,我们可以使用数组来实现符号表,将数组的索引作为键,而索引处的数组元素转载 2017-03-31 11:38:42 · 339 阅读 · 0 评论 -
算法21:实现strstr(str1, str2)
算法分析strstr函数用于判断str2是否是str1的字串。如果是,返回str2在str1首次出现的首地址;如果不是,则返回NULL。c++代码如下//str1:字符串//str2:字串//return: 返回str2在str1出现的首地址const char* strstr(const char* str1,const char* str2){ assert(str1 && st原创 2017-03-24 11:12:34 · 1290 阅读 · 0 评论 -
算法22:给定一个排好序的linked list,删除其中所有的重复元素。比如给定1->2->3->3-> 4->4->5,返回1->2->5。给定1->1->1->2->3,返回2->3
算法分析删除有序链表中所有的重复元素,采用两个指针p和q遍历链表删除的方法,另外设置一个指针指向p指针的前一个节点。需要考虑重复元素在头节点和尾节点的特殊情况。c++代码//移除有序链接中重复的元素void LinkList::RemoveAllRepeatData(){ //如果链表为空或者只有一个元素,直接返回 if(head == NULL || head->next ==原创 2017-03-24 16:40:54 · 914 阅读 · 0 评论 -
算法9:在一个循环有序的数组里查找一个数
解题思路采用中分方法进行查找,考虑到是循环有序的数组,存在一边有序的情况,将中间值与最左边值比较,查看是否有序,则左有序,否则就是右有序。然后再确定待查找值的区域。c++代码//loopBuffer:循环有序数组//length:循环有序数组长度//value:待查找的数//return:返回待查找数在数组中的位置int BinarySearch(int* loopBuffer,int le原创 2017-03-15 13:05:41 · 1316 阅读 · 1 评论 -
算法12:各类排序比较
未完待续原创 2017-03-24 16:46:39 · 330 阅读 · 0 评论 -
算法10:给一个array和一个target value, 检查array里是否存在两个数之和为target
题目分析这道算法题存在两种情况,数组中是否存在相同的值 1、给定一个整型数组,找出其中的两个数使其和等于指定的值,并返回两个数的数组下标(假定是无序数组,数组元素各不相同) 2、给定一个整型数组,找出其中的两个数使其和等于指定的值,并返回两个数的数组下标(假定存在相同的数)解题思路1、假设数组元素各不相同 采用哈希表存储整型数组,key为数组元素,value为元素下标,查找的时间复杂度为O(n原创 2017-03-15 19:04:53 · 1221 阅读 · 0 评论 -
算法25:实现String类的构造函数,拷贝构造函数和赋值函数
代码如下:class String{public: String(const char* str = NULL); String(const String& other); String& operator=(const String& other); ~String();private: char* m_data;};String::String(co原创 2017-04-01 18:17:07 · 312 阅读 · 0 评论 -
算法18:实现memmove函数
算法分析memmove与memcpy都是内存拷贝,区别在于当存在内存重叠时,memmove保证拷贝的内容是正确的,memcpy就不保证。memcpy其实是memmove的一部分。c++代码char* memmove(char* dst,const char* src,size_t count){ const char* pSrc = src; char* pDst = dst;原创 2017-03-21 13:48:47 · 433 阅读 · 0 评论 -
算法17:实现memcpy(void *src, int size, void *dest)
算法分析这道题主要考察一下几点 1、对于参数非法的判断,空指针的判断和size大小的判断 2、源数据不能被改写 3、源数据和目标数据是否存在内存重叠c++代码不考虑内存重叠的情况char* memcpy(char* dst,const char* src,size_t count){ char* ptr = dst; if(dst == NULL || src == NULL原创 2017-03-21 11:44:06 · 859 阅读 · 0 评论 -
算法1:链表的基本操作
算法1:链表的基本操作编程实现链表的基本操作,包括插入,删除,查找,逆序,打印,获取长度等基本操作。用c++实现如下:定义LinkList头文件#include <iostream>#include <string.h>//链表数据结构体struct Node{ int data; Node* next; Node(int _data):data(_data),next原创 2017-02-28 18:07:57 · 451 阅读 · 0 评论 -
算法2:在linked list中找倒数第N个结点
在linked list中找倒数第N个结点解题思路:设置一快一慢指针,快指针先走N步,然后快慢指针同时走,当快指针走到末尾时,慢指针对应的节点就是倒数第N个节点。LinkList.h添加函数//获取链表的倒数第n个节点Node* GetLastNNode(int n);LinkList.cpp函数实现如下:Node* LinkList::GetLastNNode(int n){ if(h原创 2017-03-01 12:44:06 · 1115 阅读 · 0 评论 -
算法3:给一个字符数组(a-z),如何打印该数组成员构成集合的全部子集合
给一个字符数组(a-z),如何打印该数组成员构成集合的全部子集合样例字符数组ahia,输出如下: a h i ah ai hi ahi解题思路如下:1、首先算出字符数据中所包含的字符,使用二进制数据来表示,比如abca的二进制数据表示为{1,1,1,0…0},输出二进制位为1的全部子集合。 2、打印二进制位为1的字符子集合,每个子集合与二进制关系对应如下: a 1 b 10 c原创 2017-03-03 13:32:06 · 776 阅读 · 0 评论 -
算法8:一个整数数组里怎么同时找最大和最小的数,尽量优化比较次数
解题思路n个大小的整数数组 思路1:遍历整个数组分别得出最大值和最小值,比较次数为2n 思路2:取两个数进行比较,大的与当前最大值比较,小的与当前最小值比较,则没两个数要比较3次,比较次数为1.5nc++代码//取两个数进行比较,小的数跟当前最小值比较,大的数跟当前最大值比较void GetMinMax(int* buffer,int& bufferLen,int& max, int& min原创 2017-03-08 14:17:36 · 2004 阅读 · 0 评论 -
算法4:求整型数组的连续子数组的最大和
算法4:求整型数组的连续子数组的最大和输入一个整型数组,数组里既有正数也有负数,数组中连续一个或者多个组成整型子数组,每个子数组都有一个和,求所有子数组的最大和,要求时间复杂度为O(n)。解题思路使用贪婪算法,数组从开始往后遍历,记录最大和,当前和小于0时,当前子数组和置为0.c++代码如下//使用贪婪算法,遇到sum<0的情况,就将sum置0void GetSubMaxSum(int srcBu原创 2017-03-06 10:57:40 · 677 阅读 · 0 评论 -
算法5:求两个已排序数组的交集和并集
问题描述求两个已排序数据的交集和并集,要求时间复杂度为O(m+n).解题思路A数组和B数组,A数组大小为m,B数组大小为n。 1、查找B数组的每个成员是否在A数组中,时间复杂度为O(mn) 2、由于A和B数组都是有序数组,使用二分法查找B数组的每个成员是否在A数组中,时间复杂度为O(n*lgm)。如果n比m大,则查找A数组的成员是否在B数组中,时间复杂度为O(m*lgn)。 3、使用hash表原创 2017-03-06 14:47:41 · 4234 阅读 · 0 评论 -
算法6:返回一组字符串的最长公共前缀
问题描述返回一组字符串的最长公共前缀,如 “abc”, “abcdef”, “abcd”, 则返回”abc”。解题思路首先最长公共前缀肯定小于或者等于最短字符串,设第一个字符串为公共字符串,公共字符串长度为第一个字符串的长度,遍历其他公共字符串,如果其他公共字符串比第一个字符串短,则公共字符串取较短的长度,如果其他字符串的字符不等于第一个字符串的字符,则退出比较,从而得当当前结果的公共字符串,以此类原创 2017-03-06 17:55:51 · 2012 阅读 · 0 评论 -
算法13:检查一个表达式中的括号是否合法,括号包括 {, [, (, ), ], }
算法分析考查栈的应用。遍历表达式,如果是左括号,进栈;如果是右括号,则与栈顶元素比较,匹配则出栈,否则不合法。遍历完表达式,如果是空栈,则说明表达式是合法的。c++代码bool JudgeExpression(const char* expression,int length){ bool isLegal = false; stack<char> bracketsStack;原创 2017-03-20 16:24:11 · 5566 阅读 · 3 评论 -
算法14:如何高效地用堆栈模拟队列
算法分析由于栈是先进后出,队列是先进先出。可以采用两个栈enStack和deStack来模拟队列的行为。队列的基本操作包括入队列、出队列和队列是否为空。入队列时,push元素到enStack;出队列是,从deStack中执行pop操作,如果deStack为空,则从enStack push元素到deStack,然后再执行deStack的pop操作;如果enStack和deStack都为空,则队列为空。原创 2017-03-20 17:23:11 · 428 阅读 · 0 评论 -
算法15:打印中两个整数范围内的所有素数,例如:(12, 15) ->13
算法分析1、判断是否是素数:只能被1和自己整除的素为素数,即不能被2到这个数的平方根整除的数为素数。 2、遍历区间帅选是否为素数c++代码#include <iostream>#include <math.h>using namespace std;//判断是否为素数:是否能被2和自己的平方根之间的数整除bool IsPrime(int n){ //最小的素数是2 if(n原创 2017-03-20 17:51:54 · 729 阅读 · 0 评论 -
算法7:设计一个class,类似于stack, 但可以是O(1)时间内返回min()
解题思路类中存一个数据栈和一个辅助栈,向数据栈push的时候,判断当前值与辅助栈栈顶的值的大小,如果小则push到辅助栈,否则push辅助栈的栈顶数值到辅助栈;向数据栈pop时,同时pop辅助栈的值。获取当前数值最小值即辅助栈栈顶数据,时间复杂度为O(1)MinStack类定义#include <stack>using namespace std;class MinStack{public:原创 2017-03-07 14:08:15 · 373 阅读 · 0 评论 -
算法16:实现itoa和atoi
atoi 代码实现//str:源字符串//return:返回整数int atoi(const char* str){ assert(str != NULL); //符号:0为正数,1为负数 int sign = 0; int result = 0; //去掉空格,制表符和换行符 while(*str == ' '|| *str == '\t' ||原创 2017-03-21 10:16:16 · 432 阅读 · 0 评论 -
算法12:删除数组中的重复元素
题目分析有几种情况,如下: 1、有序数组,不能额外申请空间 2、无序数组,不能额外申请空间 3、无序数组,可以额外申请空间算法分析1、有序数组,不能额外申请空间 遍历一遍数组,并设置一个计数器,当前后遍历的数不相同是,计数器加1,并将计数器所在数组的位置等于当前遍历的值。2、无序数组,不能额外申请空间 由于不能额外申请空间,需要先对数组进行快速排序3、无序数组,可以额外申请空间 1)可以原创 2017-03-16 19:07:21 · 4431 阅读 · 1 评论