剑指offer
文章平均质量分 74
剑指offer
东城青年
非宁静无以致远
微信号:15221816820
展开
-
堆排序方法
开门见山,本文讲述堆排序。就我自身对于排序的了解来看,其实堆排序是诸多排序中最难写的,光是理解起来都有点费劲,本文旨在于用通俗易懂的话,把堆排序娓娓道来。下面,开始!1:堆毫无疑问,排序两个字没必要去死磕,这里的重点,在于排序的方式,堆排序,就是以堆的形式去排序,毫无疑问,了解堆很重要。那么,什么是堆呢?这里,必须引入一个完全二叉树的概念,然后过渡到堆的概念。上图,...转载 2019-09-18 09:45:06 · 147 阅读 · 1 评论 -
插入排序法
插入排序相对冒泡排序而言是一种较为快捷方便的排序算法。冒泡排序:http://blog.csdn.net/llzk_/article/details/51547923插入排序原理很简单,讲一组数据分成两组,我分别将其称为有序组与待插入组。每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。就这样,每次插入一个元素,有序组增加,待插入组减少。直到待...转载 2019-11-06 10:12:55 · 288 阅读 · 1 评论 -
链表是否有环、环长度、环起点
链表是否有环,环的长度及起点原创 2023-07-27 15:35:37 · 627 阅读 · 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 · 587 阅读 · 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 · 138 阅读 · 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 · 121 阅读 · 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 · 110 阅读 · 0 评论 -
剑指offer二十六:二叉树的深度
原创 2019-04-06 13:13:21 · 109 阅读 · 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 · 94 阅读 · 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 · 130 阅读 · 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 · 89 阅读 · 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 · 113 阅读 · 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 · 85 阅读 · 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 · 92 阅读 · 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 · 88 阅读 · 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 · 82 阅读 · 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 · 132 阅读 · 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 · 106 阅读 · 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 · 78 阅读 · 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 · 136 阅读 · 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 · 111 阅读 · 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 · 90 阅读 · 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 · 187 阅读 · 0 评论 -
剑指offer十:实现快速排序
实现快速排序算法的关键在于先在数组中选择一个数字,接下来把数组中的数字分为两部分,比选择的数字小的数字移到数组的左边,比选择的数字大的数字移到数组的右边。快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程...原创 2019-04-02 16:00:54 · 612 阅读 · 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 · 111 阅读 · 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 · 116 阅读 · 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 · 105 阅读 · 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 · 130 阅读 · 0 评论 -
剑指offer五:字符串之替换空格
字符串是由若干字符组成的序列,C/C++中每个字符都以字符'\0'作为结尾,这样我们就能很方便地找到字符串的最后尾部。但由于这个特点,每个字符串中都有一个额外字符的开销,稍不留神就会造成字符串的越界。比如下面的代码:char str[10];strcpy(str,"0123456789");我们先声明一个长度为10的字符数组,然后把字符串“0123456789”复制到数组中。“0123...原创 2019-03-27 20:00:04 · 146 阅读 · 0 评论 -
剑指offer四:二维数组中的查找
数组与指针的联系数组和指针是相互关联又有区别的两个概念。当我们声明一个数组时,其数组的名字也是一个指针,该指针指向数组的第一个元素。我们可以用一个指针来访问数组。下面通过一个例子来了解数组和指针的区别。运行下面的代码,请问输出是什么?二维数组中的查找#include <iostream>using namespace std;bo...原创 2019-03-27 16:33:23 · 100 阅读 · 0 评论 -
剑指offer三:关于sizeof
通常语言面试有3种类型,第一种类型是面试官直接询问应聘者对C++概念我的理解。这种类型的问题,面试官特别喜欢了解应聘者对C++关键字的理解程度。例如:在C++中,有哪4个与类型转换相关的关键字?这些关键字各有什么特点,应该在什么场合下使用?在这种类型的题目中,sizeof是经常被问道的一个概念。比如下面的面试片段,就反复出现在各公司的技术面试中。面试官:定义一个空的类型,里面没有任何...原创 2019-03-27 14:26:10 · 155 阅读 · 0 评论 -
剑指offer二:求链表中的倒数第k个结点
一个很多人都曾经被面试过的问题:求链表中的倒数第k个结点。有不少人在面试之前在网上看到过这个题目,因此知道思路是用两个指针,第一个指针先走k-1步,然后两个指针一起走。当第一个指针走到尾结点时,第二个指针指向的就是倒数第k个结点。于是他大手一挥,写下了下面的代码:pnode FindKthTotail(pnode head,int k){ if(head == NULL) ...原创 2019-03-22 09:17:20 · 83 阅读 · 0 评论 -
剑指offer一:把一个字符串转换成整数
以微软面试开发工程师时最常用的一个问题为例:把一个字符串转换成整数。这个题目很简单,很多人都能在三分钟之内写出如下不到10行的代码:int StrToInt(char *string){ int number = 0; while(*string !='\0') { number = number*10 + *string - '0'; ...原创 2019-03-21 19:56:11 · 256 阅读 · 0 评论