剑指offer
文章平均质量分 58
景亍
这个作者很懒,什么都没留下…
展开
-
剑指offer 10----计算一个整数二进制位中1的个数
计算一个整数二进制位中1的个数。要求效率尽可能的高。且能正确求正数和负数的二进制中1的个数。int BitCount(int n){ int count = 0; while (n) { n = n&(n - 1); ++count; } return count;}int main(){ int n = 9; int tty = BitCount(n); c原创 2017-07-20 11:44:40 · 524 阅读 · 0 评论 -
剑指offer 47----实现一个Add函数,让两个数相加,但是不能使用+、-、*、/等四则运算符。ps:也不能用++、--
实现一个Add函数,让两个数相加,但是不能使用+、-、*、/等四则运算符。ps:也不能用++、--#include #include using namespace std;int Add(int& num1, int& num2){ if (num1 == 0) { return num2; } if (num2 == 0) { return num1; }原创 2017-07-14 15:44:15 · 1318 阅读 · 5 评论 -
剑指offer 48---设计一个类不能被继承
设计一个类不能被继承在C++继承中,子类的构造函数会自动调用父类的构造,子类的析构会自动调用父类的析构。一个简单的例子:class AA{public: AA() { cout << "AA()" << endl; } ~AA() { cout << "~AA()" << endl; }};class BB:public AA{public: BB(原创 2017-07-17 13:27:51 · 634 阅读 · 0 评论 -
剑指offer 46---实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字
实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。//实现1+2+3...+n,要求不能使用乘除法、循环、条件判断、选择相关的关键字。#include #include using namespace std;int Sum(int k) { return k >0 ? k + Sum(k - 1) : 0;}int main(){原创 2017-07-14 16:32:43 · 371 阅读 · 0 评论 -
剑指offer 4---替换空格
一.将一句话里的单词倒置 “student a am I” 改为 “I am a student”void reverse_string(char* start, char* end){ assert(start); assert(end); while (start < end) { *start = *start^*end; *end = *start^*end;原创 2017-07-03 16:36:15 · 980 阅读 · 3 评论 -
剑指offer 21---实现一个栈, 要求实现Push( 出栈) 、 Pop( 入栈) 、 Min( 返回最小值的操作) 的时间复杂度为O(1)
栈:先进后出实现方法:利用栈的性质,首先建立q1,q2两个栈,两个栈均为空。1.插入数据时,第一个数据在q1,q2中均插入。2.后面的数据依次插入q1中,每次插入一个数据后均和q2中的栈顶比较,如果此时数据大于s2的栈顶,则该数据不插入q2 中,如果此时数据小于或等于此时q2的栈顶,则将该数 据插入s2,依次进行。3.当所有数据入栈完毕后,s2的栈顶存储的即为该原创 2017-05-03 23:23:20 · 1213 阅读 · 3 评论 -
剑指offer 7---使用两个栈实现一个队列
栈:先进后出队列:先进先出首先构建栈q1,q2。入队列:入栈q1。出队列:首先将q1中的所有元素依次压入q2中,此时q1为空,q2中存放所有数据,在依次将q2中数据pop,即实现队列。代码实现如下:#include #include #include #include using namespace std;template class Queue{原创 2017-05-03 20:41:48 · 874 阅读 · 5 评论 -
剑指offer 7---使用两个队列实现一个栈
队列:先进先出栈:先进后出首先构建队列q1,q2。入栈:入队列q1。出栈:将q1队列中的前n-1个元素倒入到q2中,在pop q1中的第n个元素,即为要出栈的元素,下次,则对q2操作,每次保证有一个队列为空。栈顶:将q1中前n-1个元素倒入q2中之后,第n个元素即为栈顶。考虑到我们取栈顶元素的便利性,我们在实现时使得栈顶等于队列头;由于栈的pop弹出栈顶元素,而队列的p原创 2017-05-03 17:24:10 · 1156 阅读 · 1 评论 -
剑指offer 22---判断元素出栈、 入栈顺序的合法性
题目:判断元素出栈、 入栈顺序的合法性。 如: 入栈的序列(1,2,3,4,5) , 出栈序列为(4,5,3,2,1) 是合法序列, 入栈的序列(1,2,3,4,5) , 出栈序列为(1,5,3,2,4) 是不合法序列。代码实现如下:#include #include #include #include using namespace std;//判断原创 2017-05-12 13:32:41 · 855 阅读 · 0 评论 -
剑指offer 5---从尾到头打印单链表
从尾到头打印单链表PS:如果题设不要求不能改变链表结构时,可以使用单链表的逆置(之前已经写过),单链表的逆置改变了链表的方向,严格要求时不能这样写。解1:原创 2017-07-18 15:04:26 · 542 阅读 · 1 评论 -
剑指offer 34---丑数
题目:求按从小到大的第1500个丑数。丑数:只包含因子2,3,5的数称为丑数。所谓一个数m是另一个数n的因子,是指n能被m整除。例: 解1:直观解法,从1开始计算,然后计数,直到第1500个丑数缺陷:每个整数都需要计算,效率非常低//判断是不是丑数bool IsUflyNum(int num){ if (num <= 0) { retu原创 2017-08-04 00:03:07 · 587 阅读 · 1 评论 -
剑指offer 3---二维数组的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都是按照从上到下递增的顺序排序。请完成函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。代码实现: bool Find(int target, vector > array) { if(array.size()==0){ return 0原创 2017-08-19 18:31:12 · 749 阅读 · 1 评论 -
剑指offer 14---调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。原创 2017-08-02 17:27:25 · 438 阅读 · 0 评论 -
剑指offer 9---斐波那契数列
题目:写一个函数,输入n,求斐波那契数列的第n项。解1:递归实现斐波那契数列#include #include using namespace std;int Fibonacci(int n) //递归实现斐波那契数列{ if (n <= 0) { return 0; } if (n == 1) { return 1; }原创 2017-08-01 23:38:43 · 763 阅读 · 5 评论 -
剑指offer 35---查找第一个只出现一次的字符
查找第一个只出现一次的字符//第一个只出现一次的字符 "abcdefghigkacdefg"char FirstRepete(char* str){ if (str == NULL) { return '\0'; } //利用哈希表解决 const int tablesize = 256; //一个字符占一个字节,所以有256种情况 unsigned int Ha原创 2017-07-19 18:22:18 · 723 阅读 · 4 评论 -
剑指offer 15---查找单链表的倒数第k个节点,要求只能遍历一次链表
查找单链表的倒数第k个节点,要求只能遍历一次链表#include #include using namespace std;struct ListNode{ int _value; ListNode* _next; ListNode(const int& value) :_value(value) , _next(NULL) {}};//查找单链表的倒数第K个结原创 2017-07-14 14:30:44 · 823 阅读 · 0 评论 -
剑指offer 16---单链表的逆置
单链表的逆置非递归实现#include #include using namespace std;struct ListNode{ int _value; ListNode* _next; ListNode(const int& value) :_value(value) , _next(NULL) {}};//单链表的逆置 非递归实现ListNode原创 2017-07-14 22:53:20 · 678 阅读 · 0 评论 -
剑指offer 17---合并两个排序的链表
一.链表1:1 3 5 7 9 链表2:2 4 6 8 10 升序排列#include #include using namespace std;//合并两个有序链表,假设链表是升序排列//链表1:1,3,5,7,9 链表2:2,4,6,8,10struct ListNode{ int _value; ListNode* _next; ListNo原创 2017-07-13 15:56:34 · 453 阅读 · 0 评论 -
剑指offer 15---判断链表是否带环?若带环求环的长度?若带环求环的入口点?
判断链表是否带环?若带环求环的长度?若带环求环的入口点?判断链表是否带环?//判断链表是否带环bool IsCircle(ListNode* pHead){ if (pHead == NULL || pHead->_next == NULL) { return false; } //快慢指针法 ListNode* fast = pHead; ListNode* sl原创 2017-07-15 18:34:06 · 758 阅读 · 0 评论 -
剑指offer 37---求两个链表的第一个公共结点
求两个链表的第一个公共结点思路:此处求解的是两个单链表,如果两个单向链表有公共的结点,那么这两个链表从某一结点开始,它们的_next都指向同一结点。由于是单链表的结点,每个结点只有一个_next,因此从第一个公共结点开始,之后它们所有的结点都是重合的,不可能再出现分叉。所以两个有公共结点而部分重合的链表,拓扑形状像一个Y,而不可能是Xstruct ListNode{原创 2017-07-22 21:45:39 · 679 阅读 · 0 评论 -
剑指offer 18---输入两棵二叉树A和B,判断B是不是A的子结构
输入两棵二叉树A和B,判断B是不是A的子结构思路:1.先在A中找和B的根节点相同的结点2.找到之后遍历对应位置的其他结点,直到B中结点遍历完,都相同时,则B是A的子树3.对应位置的结点不相同时,退出继续在A中寻找和B的根节点相同的结点,重复步骤,直到有任何一棵二叉树为空退出/*struct TreeNode { int val; struct Tr原创 2017-07-23 17:36:34 · 1832 阅读 · 0 评论 -
剑指offer 40---数组中只出现一次的字符
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写出程序找出这两个只出现了一次的数字,要求时间复杂度为O(n),空间复杂度为O(1)。原创 2017-08-08 10:57:23 · 722 阅读 · 0 评论 -
剑指offer 39---求二叉树的深度 && 输入一颗二叉树的根节点,判断该树是不是平衡二叉树
求二叉树的深度递归求解/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: int TreeDe原创 2017-07-23 21:46:16 · 791 阅读 · 0 评论 -
求二叉树叶子节点的个数 && 求第K层的节点个数
求二叉树叶子节点的个数思路:1.如果根节点为NULL时,则是空树,返回0;2.根节点不为空时,如果根节点的左右子树均为空,则该二叉树中只有一个节点,即返回1;3.叶子节点的个数=左子树叶子节点数+右子树叶子节点数;int _GetNodeyezi(Node* root) //叶子节点的个数 { if (root == NULL) { return 0;原创 2017-07-23 20:11:02 · 1413 阅读 · 0 评论 -
剑指offer 38---数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数,例如输入排序数组{1,2,3,3,3,3,4,5};和数字3,由于3在数组中出现了4次,因此输出4.思路:时间复杂度: O(logn)空间复杂度: O(1)int FindFirstK(int* arr,原创 2017-08-08 14:40:03 · 631 阅读 · 0 评论 -
剑指offer 32---从1到n整数中1出现的次数
从1到n整数中1出现的次数原创 2017-08-06 09:25:59 · 264 阅读 · 0 评论