c++
zbh_pro
珍惜每一天,明天不会太多
展开
-
判断链表是否带环?若带环求环的长度?若带环求环的入口点?
struct ListNode { int _val; ListNode* _pNext; };1.判断是否带环 利用一快一慢指针来求解,一个指针走一步,一个指针走两步,若该链表带环则必定会在环中相遇。如果fast->next为NULL则不存在 ListNode* IsHaveCircle(ListNode *pHead) { if(pHead==NULL)原创 2017-07-16 15:43:28 · 247 阅读 · 0 评论 -
实现一个栈Stack,要求实现Push(入栈)、Pop(出栈)、Min(返回最小值的操作)的时间复杂度为O(1)
栈的出栈入栈时间复杂度为O(1),这个不难,对于返回值Min最小值得时间复杂度为O(1),我们可以借助一个辅助栈s2来保存比原栈s1的栈顶s2.top()元素小的数。 1.如果栈s1和栈s2都是空栈,则将数据压入两个栈中。 2.再次压栈时将压入的数据与s2栈顶元素比较,如果比s2栈顶元素小或者等于则将此数据压入s1和s2中,反之只将此数据压入s1中。此时s2中的栈顶元素就是最小的。 3.pop原创 2017-08-01 19:15:58 · 581 阅读 · 0 评论 -
查找一个字符串中第一个只出现两次的字符。比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1)
因为要求时间复杂度为O(N),所以不可以两层循环挨个比较,需要借助一块辅助空间,定义一个256大小的数组arr,将字符转化为assic码值作为下标。然后遍历统计数量等于二的。 注意第二次遍历查找字符串中第一个只出现两次的字符必须的按照字符串中字符出现的顺序遍历。如果从0到256遍历的可能找到的只出现两次的字符不一定是第一个出现的。char FindFitst(const char* str){原创 2017-08-01 19:58:08 · 508 阅读 · 0 评论 -
插入排序及其优化
插入排序:把一个无序的数组分为两部分,一部分为有序(刚开始只有一个元素),一部分为无序(从第二个元素开始),将无序元素一个一个插入到有序元素中。void InsertSort(int *arr, size_t size){ for(int i=1; i<size; ++i) { if(arr[i]<arr[i-1]) { i原创 2017-08-09 17:26:07 · 430 阅读 · 0 评论 -
结构体内存对齐
结构体内存对齐有两大规则规则1:结构中的元素都是按照定义一个一个按顺序放到内存中去的,但不是紧密存储的。从结构体的起始位置开始,在每个元素放到内存的时候他们各自认为前面的元素都是按照自己的大小来划分的,因此位置一定是从自己大小的整数倍上开始的。(以结构体的起始位置从0开始) 规则2:在规则1的基础上,结构体的总大小是其中所有元素中宽度最大的整数倍,不够要补齐。tpedef struct Struc原创 2017-08-02 18:32:19 · 312 阅读 · 1 评论 -
使用两个栈实现一个队列+使用两个队列实现一个栈
栈的特点是先进后出 队列的特点是先进先出所以用两个栈实现一个队列,要保证它先进先出 入栈和如队列没什么区别,区别就在出栈和出队列 用栈保证队列的先进先出,可以将数据压入空栈s1,然后将s1的栈顶(top)元素压入栈s2,此时s2的栈顶元素就是第一个进入队列的元素。#include<stack>template<class T>class StackQueue{public: S原创 2017-07-28 16:59:10 · 268 阅读 · 0 评论