
剑指offer
文章平均质量分 55
剑指offer
东城青年
非宁静无以致远
微信号:15221816820
展开
-
归并排序法
我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。归并排序算法有两个基本操作,一是分,也就是把原数组划分成两个子数组的过程,另一个是治,它将两个有序数组合并成一个更大的有序数组。归并排序法是典型的分治算法应用,1946年由冯.诺伊曼发明。原创 2024-06-03 16:44:57 · 411 阅读 · 0 评论 -
快速排序法
快速排序(QuickSort)是对冒泡排序的一种改进,快速排序由C.A.R.Hoare在1960年提出。原创 2024-05-31 18:30:02 · 497 阅读 · 0 评论 -
希尔排序法
gap=2,从a[2]开始,a[2]和a[0]进行插入排序,a[3]和a[1]插入排序,a[4]和a[2]、a[0]插入排序......上面gap=2,即5,14,18,27,68为一组;13,20,36,39,51为一组。可以发现左边都是较小的数据,右边都是较大的数据,更方便把分成的每一个组进行插入排序。为什么 要采取上面分组的方法呢(gap),换一种方法也可以吗?原创 2024-05-28 15:25:57 · 455 阅读 · 0 评论 -
计数排序法
当输入的元素是n个0到k之间的整数时,它的运行时间复杂度是O(n+k)。计数排序不是比较排序,它的速度快于任何比较排序的算法。由于用来计数的数组A的长度取决于待排数组中数据的范围(最大值-最小值+1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。计数排序的核心在于将输入数据转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。原创 2024-05-28 10:47:09 · 311 阅读 · 0 评论 -
选择排序法
【代码】选择排序法。原创 2024-05-27 16:34:00 · 340 阅读 · 0 评论 -
冒泡排序法
【代码】冒泡排序法。原创 2024-05-27 15:39:04 · 147 阅读 · 0 评论 -
算法的时间与空间复杂度
算法是指用来操作数据、解决程序问题的一种方法。对于同一问题,使用不同的算法,也许最终结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。那我们该如何去衡量不同算法之间的优劣呢?主要还是从算法所占用的【时间】和【空间】两个维度去考量。因此,评价一个算法的效率主要是看它的时间复杂度和空间复杂度情况。然而,有的时候时间和空间却又是鱼和熊掌不可兼得,那我们就需要从从中去取一个平衡点。下面我来分别介绍一下【时间复杂度】和【空间复杂度】的计算方式。原创 2024-05-22 15:36:53 · 718 阅读 · 0 评论 -
堆排序方法
开门见山,本文讲述堆排序。就我自身对于排序的了解来看,其实堆排序是诸多排序中最难写的,光是理解起来都有点费劲,本文旨在于用通俗易懂的话,把堆排序娓娓道来。下面,开始!1:堆毫无疑问,排序两个字没必要去死磕,这里的重点,在于排序的方式,堆排序,就是以堆的形式去排序,毫无疑问,了解堆很重要。那么,什么是堆呢?这里,必须引入一个完全二叉树的概念,然后过渡到堆的概念。上图,...原创 2019-09-18 09:45:06 · 183 阅读 · 1 评论 -
插入排序法
插入排序相对冒泡排序而言是一种较为快捷方便的排序算法。冒泡排序:http://blog.youkuaiyun.com/llzk_/article/details/51547923插入排序原理很简单,讲一组数据分成两组,我分别将其称为有序组与待插入组。每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。就这样,每次插入一个元素,有序组增加,待插入组减少。直到待...原创 2019-11-06 10:12:55 · 348 阅读 · 1 评论 -
链表是否有环、环长度、环起点
链表是否有环,环的长度及起点原创 2023-07-27 15:35:37 · 695 阅读 · 0 评论 -
剑指offer三十:用C++设计一个不能被继承的类
当子类从基类继承时会自动调用父类的构造函数和析构函数:#include<iostream>using namespace std;class sealedClass{public: static sealedClass* getInstance() { return new sealedClass(); } static void deleteInsta...原创 2019-04-08 14:16:11 · 670 阅读 · 0 评论 -
剑指offer二十九:求1+2+...+n
#include<iostream>using namespace std;class Temp{public: Temp(){n++;sum += n;} static int getsum() { return sum; }private: static int n; static int sum;};//我们不能把静态成员的初始化放置在...原创 2019-04-08 13:36:20 · 192 阅读 · 0 评论 -
剑指offer二十八:翻转单词顺序VS左旋转字符串
#include<iostream>using namespace std;void Reverse(char* pBegin, char* pEnd){ if (pBegin == NULL || pEnd == NULL) return; while (pBegin < pEnd) { char temp = *pBegin...原创 2019-04-08 11:03:40 · 153 阅读 · 0 评论 -
剑指offer二十七:和为s的两个数字
#include<iostream>using namespace std;bool findNumbersWithSum(int data[], int length, int sum){ bool found = false; if (length < 1) return found; int ahead = 0; int behind ...原创 2019-04-06 13:36:02 · 139 阅读 · 0 评论 -
剑指offer二十六:二叉树的深度
原创 2019-04-06 13:13:21 · 142 阅读 · 0 评论 -
剑指offer二十五:两个链表的第一个公共结点
#include<iostream>using namespace std;//链表结点的定义typedef struct linklist{ int data; linklist* next;}node, *pnode;//获得链表的长度int getListLength(pnode head){ int length = 0; whil...原创 2019-04-06 13:05:26 · 129 阅读 · 0 评论 -
剑指offer二十四:第一个只出现一次的字符
#include<iostream>using namespace std;char firstNotrepeatChar(char* string){ if (string == NULL) return NULL; const int tableSize = 256; unsigned int hashTable[tableSize]; for...原创 2019-04-06 12:15:26 · 169 阅读 · 0 评论 -
剑指offer二十三:丑数
#include<iostream>using namespace std;bool isUgly(int number){ while (number % 2 == 0) number /= 2; while (number % 3 == 0) number /= 3; while (number % 5 == 0) number /= 5; ...原创 2019-04-06 11:46:49 · 120 阅读 · 0 评论 -
剑指offer二十二:从1到n整数1出现的次数
#include<iostream>using namespace std;int numberOfOne(unsigned int n){ int number = 0; while (n) { if (n % 10 == 1) number++; n = n / 10; } return number;}int numberOfOne...原创 2019-04-06 11:22:57 · 139 阅读 · 0 评论 -
剑指offer二十一:连续子数组的最大和
#include<iostream>using namespace std;bool invalidInput = false;int findMaxArraySum(int* a, int length){ if (a == NULL || length <= 0) { invalidInput = true; return 0; }...原创 2019-04-06 11:11:13 · 118 阅读 · 0 评论 -
剑指offer二十:二叉搜索树的后序遍历序列
#include<iostream>using namespace std;typedef struct treenode{ int data; treenode* left; treenode* right;}node,*pnode;bool verfySquenceOfBST(int sequence[], int length){ if (se...原创 2019-04-04 14:39:18 · 129 阅读 · 0 评论 -
剑指offer十九:二叉树的镜像
#include<iostream>using namespace std;typedef struct treenode{ int data; treenode* left; treenode* right;}node,*pnode;void mirrorRecursive(pnode head){ if (head == NULL || (...原创 2019-04-04 11:53:57 · 132 阅读 · 0 评论 -
剑指offer十八:树的子结构
#include<iostream>using namespace std;typedef struct treenode{ int data; treenode* left; treenode* right;}node, *pnode;bool doesTreeHaveTree(pnode root1, pnode root2){ if...原创 2019-04-04 11:22:11 · 119 阅读 · 0 评论 -
剑指offer十七:从上往下打印二叉树
#include<iostream>using namespace std;#include<queue>//定义结点typedef struct linknode{ int data; linknode* left; linknode* right;}node,*pnode;//构建树pnode construct2(){...原创 2019-04-04 08:30:44 · 162 阅读 · 0 评论 -
剑指offer十六:调整数组顺序使奇数位于偶数前面
#include<iostream>using namespace std;void reorderOddEven(int* a, unsigned int length){ if (a == NULL || length == 0) return; int* pBegin = a; int* pEnd = a + length - 1; whi...原创 2019-04-03 16:06:26 · 144 阅读 · 0 评论 -
剑指offer十五:在O(1)时间删除链表结点
结点定义如下:typedef struct linklist{ int data; linklist* next;}node, *pnode;在头部添加结点,生成一个一定长度的链表:pnode addNodeToHead(pnode head, pnode newnode){ if (head == NULL) { newnode->next =...原创 2019-04-03 15:47:51 · 119 阅读 · 0 评论 -
剑指offer十四:打印1到最大的n位数
#include<iostream>using namespace std;//字符串表示大树bool Increament(char* number){ bool isOverFlow = false; int TakeOver = 0; int length = strlen(number); for (int i...原创 2019-04-03 13:54:01 · 167 阅读 · 0 评论 -
剑指offer十三:数值的整数次方
#include<iostream>using namespace std;double PowerWithUnsignedExponent(double base, int exponent);bool equal(double num1, double num2){ if (abs(num1 - num2) < 0.0000001) ...原创 2019-04-03 10:09:51 · 153 阅读 · 0 评论 -
剑指offer十二:二进制中1的个数
常见算法,将输入的数据依次右移与1做与运算,但是如果是负数,其最高位始终是1(符号位),这样就会陷入死循环。int count_one(int n){ int count = 0; while (n) { if (n & 1) count++; n = n >> 1; } return count;}为了避免死...原创 2019-04-02 19:17:23 · 127 阅读 · 0 评论 -
剑指offer十一:斐波那契数列
递归代码如下:int Fibonacci(int n){ if (n == 0) return 0; if (n == 1) return 1; else return Fibonacci(n - 1) + Fibonacci(n - 2);}循环代码如下:int Fibonacci(unsigned int n){...原创 2019-04-02 17:08:50 · 224 阅读 · 0 评论 -
剑指offer十:实现快速排序
实现快速排序算法的关键在于先在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的数字移到数组的左边,比选择的数字大的数字移到数组的右边。快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程...原创 2019-04-02 16:00:54 · 677 阅读 · 0 评论 -
剑指offer九:重建二叉树
#include <iostream>using namespace std;struct binary_tree_node { int value; binary_tree_node* left; binary_tree_node* right;};binary_tree_node* binary_tree_constuct(int* pr...原创 2019-04-02 10:55:06 · 146 阅读 · 0 评论 -
剑指offer八:用两个栈实现队列
#include<iostream>#include<stack>using namespace std;//定义模板类,参数T可以是任意的类型,后面实例化的时候指出即可template <typename T> class Queue{public: Queue(void) {}; ~Queue(void) {}; ...原创 2019-03-31 17:53:25 · 146 阅读 · 0 评论 -
剑指offer七:旋转数组中的最小数字
#include<iostream>using namespace std;//顺序查找数组最小值int minInorder(int* a, int index1, int index2){ int result = a[index1]; for (int i = index1 + 1; i < index2; i++) { ...原创 2019-03-31 15:06:03 · 139 阅读 · 0 评论 -
剑指offer六:从尾到头打印链表
如果可以改变链表结构,将链表结点的指针反转过来,其思路如下:(一定要提前先保存下一节点next = temp->next,因为temp赋值后就变了)linklistp reversePointer(linklistp head){ linklistp prev = NULL; linklistp temp = head; linklistp next; while...原创 2019-03-29 14:02:39 · 163 阅读 · 0 评论 -
剑指offer五:字符串之替换空格
字符串是由若干字符组成的序列,C/C++中每个字符都以字符'\0'作为结尾,这样我们就能很方便地找到字符串的最后尾部。但由于这个特点,每个字符串中都有一个额外字符的开销,稍不留神就会造成字符串的越界。比如下面的代码:char str[10];strcpy(str,"0123456789");我们先声明一个长度为10的字符数组,然后把字符串“0123456789”复制到数组中。“0123...原创 2019-03-27 20:00:04 · 210 阅读 · 0 评论 -
剑指offer四:二维数组中的查找
数组与指针的联系数组和指针是相互关联又有区别的两个概念。当我们声明一个数组时,其数组的名字也是一个指针,该指针指向数组的第一个元素。我们可以用一个指针来访问数组。下面通过一个例子来了解数组和指针的区别。运行下面的代码,请问输出是什么?二维数组中的查找#include <iostream>using namespace std;bo...原创 2019-03-27 16:33:23 · 129 阅读 · 0 评论 -
剑指offer三:关于sizeof
通常语言面试有3种类型,第一种类型是面试官直接询问应聘者对C++概念我的理解。这种类型的问题,面试官特别喜欢了解应聘者对C++关键字的理解程度。例如:在C++中,有哪4个与类型转换相关的关键字?这些关键字各有什么特点,应该在什么场合下使用?在这种类型的题目中,sizeof是经常被问道的一个概念。比如下面的面试片段,就反复出现在各公司的技术面试中。面试官:定义一个空的类型,里面没有任何...原创 2019-03-27 14:26:10 · 196 阅读 · 0 评论 -
剑指offer二:求链表中的倒数第k个结点
一个很多人都曾经被面试过的问题:求链表中的倒数第k个结点。有不少人在面试之前在网上看到过这个题目,因此知道思路是用两个指针,第一个指针先走k-1步,然后两个指针一起走。当第一个指针走到尾结点时,第二个指针指向的就是倒数第k个结点。于是他大手一挥,写下了下面的代码:pnode FindKthTotail(pnode head,int k){ if(head == NULL) ...原创 2019-03-22 09:17:20 · 127 阅读 · 0 评论 -
剑指offer一:把一个字符串转换成整数
以微软面试开发工程师时最常用的一个问题为例:把一个字符串转换成整数。这个题目很简单,很多人都能在三分钟之内写出如下不到10行的代码:int StrToInt(char *string){ int number = 0; while(*string !='\0') { number = number*10 + *string - '0'; ...原创 2019-03-21 19:56:11 · 305 阅读 · 0 评论